阅读 155

UE4 Slate控件之TreeView 使用例子(一)

UE4 Slate控件之TreeView 使用例子(一)

TreeView例子

先从Contruct中往子Slot添加Widget,先声明指向STreeView的指针,后续方便进行视图的一些操作

	TSharedPtr<STreeView<TSharedPtr<FString>>> TreeBeingTested;
	TArray<TSharedPtr<FString>> Items;

.ItemHeight,.TreeItemsSource,.OnGenerateRow,通过跳到对应的声明处,可以知道这有些是通过SLATE_BEGIN_ARGS或SLATE_EVENT声明注入的,就需要通过.XXX(YYY)的方式初始化,TreeView有些EVENT是必须要有初始化的,不然会报错,例如OnGetChildren,

ChildSlot
	[
		SNew(SVerticalBox)
		+ SVerticalBox::Slot()
		[
			SNew(SVerticalBox)
			+ SVerticalBox::Slot()
			[
				SNew(SBorder)
				.BorderImage(FCoreStyle::Get().GetBrush("ToolPanel.GroupBorder"))
				[
					SAssignNew(TreeBeingTested, STreeView< TSharedPtr<FString> >)
					.ItemHeight(24)
					.TreeItemsSource(&Items)
					.OnGenerateRow(this, &SSkillLogTreeWidgetItem::OnGenerateWidgetForTree)
					.OnGetChildren(this, &SSkillLogTreeWidgetItem::OnGetChildrenForTree)
					.WheelScrollMultiplier(60.f)
					.OnSelectionChanged(this, &SSkillLogTreeWidgetItem::OnSelectionChanged)
					.HeaderRow
					(
						SNew(SHeaderRow)
						+ SHeaderRow::Column(Args._ColumnName).FixedWidth(150.0f).DefaultLabel(Args._ColumnLabel)
					)
				]
			]
		]
	];

ArgumentType就是我们在STreeView进行New时候写的

所以OnGetChildren函数就是

当选择元素的时候会执行的事件,此处很多函数内部都是用SLATE_EVENT进行前置声明,只需要在SAssignNew或SNew的时候,通过.XXX=(XXXXX)实现事件功能

void SSkillLogTreeWidgetItem::OnSelectionChanged(TSharedPtr<FString> Item, ESelectInfo::Type SelectInfo){   if (!Item.IsValid())      return;

   UpDateWidgetItemByColumnAndID(ColumnName.ToString(), **Item.Get());
}

为TreeView生成每一个Widget,也就是每一行

TSharedRef<ITableRow> SSkillLogTreeWidgetItem::OnGenerateWidgetForTree(TSharedPtr<FString> InItem,                                                                       const TSharedRef<STableViewBase>& OwnerTable){	return SNew(SSkillLogItemEditor, OwnerTable).ItemToEdit(InItem);
}

因为每一行的元素都要看成一个个体,也就是类的实例,当多Column的时候需要类需要继承SMultiColumnTableRow

class SSkillLogItemEditor : public SMultiColumnTableRow<TSharedPtr<FString>>
{public:
	SLATE_BEGIN_ARGS(SSkillLogItemEditor) : _ItemToEdit()
		{}

		SLATE_EVENT(FOnCanAcceptDrop, OnCanAcceptDrop)
	
		SLATE_EVENT(FOnAcceptDrop, OnAcceptDrop)
	
		SLATE_EVENT(FOnDragDetected, OnDragDetected)

		SLATE_ARGUMENT(TSharedPtr<FString>, ItemToEdit)

	SLATE_END_ARGS()	void Construct( const FArguments& InArgs, const TSharedRef<STableViewBase>& InOwnerTableView);	
	virtual TSharedRef<SWidget> GenerateWidgetForColumn(const FName& ColumnName) override;	FText GetID() const;private:
	TSharedPtr<FString> ItemToEdit;
};

这个地方可以用ColumnName生成不同的TextBlock

void SSkillLogItemEditor::Construct(const FArguments& InArgs, const TSharedRef<STableViewBase>& InOwnerTableView){
	ItemToEdit = InArgs._ItemToEdit;

	FSuperRowType::Construct(FSuperRowType::FArguments().Padding(0), InOwnerTableView);
}TSharedRef<SWidget> SSkillLogItemEditor::GenerateWidgetForColumn(const FName& ColumnName){	const FSlateFontInfo ItemEditorFont = FCoreStyle::Get().GetFontStyle(TEXT("NormalFont"));	return SNew(SHorizontalBox)
		+ SHorizontalBox::Slot()
		.AutoWidth()
		[
			SNew(SExpanderArrow, SharedThis(this))
    			.IndentAmount(16)
    			.ShouldDrawWires(true)
		]
		+ SHorizontalBox::Slot()
		[
			SNew(STextBlock).Font(ItemEditorFont).Text(this, &SSkillLogItemEditor::GetID).Margin(5)
		];
}FText SSkillLogItemEditor::GetID() const{
	ensure(ItemToEdit.IsValid());	return FText::FromString(*ItemToEdit.Get());
}

后续完善再添加更多例子~

来源https://www.cnblogs.com/shadow-lr/p/Slate_TreeView_Example1.html

文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐