大纲视图需要treeview控件的树形结构展示,创建一个treeview需要两个要素:
1、Item:我称之为一组数据,就类似于一个actor中都包含哪些组件,或者是一个类与类中的成员。
2、treeview控件:实现树形结构的类,在这个类中将item作为数据添加到树形结构中,然后创建树形结构。
Item数据类的示例(没有什么复杂实现,所以只有一个.h就可以)
#pragma once
class FCustomItemClass : public TSharedFromThis<FCustomItemClass>
{
public:
//
FString Name;
//
TArray<TSharedPtr<FCustomItemClass>> Children;
// 构造函数
FCustomItemClass(const FString& InName) : Name(InName) { }
void addChild(TSharedPtr<FCustomItemClass> Child)
{
Children.Add(Child);
}
};
treeview类的示例
#pragma once
#include "CustomItemClass.h"
class CUSTOMWINDOW_API SCustomOutliner : public SCompoundWidget
{
public:
SLATE_BEGIN_ARGS(SCustomOutliner){}
SLATE_END_ARGS()
void Construct(const FArguments& InArgs);
private:
// 1. TreeView 必需的两个成员
TSharedPtr<STreeView<TSharedPtr<FCustomItemClass>>> TreeViewWidget; // TreeViewData
TArray<TSharedPtr<FCustomItemClass>> RootItems; // 根节点数组
// 2. TreeView 必需的两个回调函数
TSharedRef<ITableRow> OnGenerateRow(TSharedPtr<FCustomItemClass> Item, const TSharedRef<STableViewBase>& OwnerTable);
void OnGetChildren(TSharedPtr<FCustomItemClass> Item, TArray<TSharedPtr<FCustomItemClass>>& OutChildren);
};
#include "CustomOutliner.h"
#include "CustomItemClass.h"
#include "Kismet/GameplayStatics.h"
#include "GameFramework/Actor.h"
void SCustomOutliner::Construct(const FArguments& InArgs)
{
UWorld* World = GEngine->GetWorldContexts()[0].World();
if (World)
{
TSharedPtr<FCustomItemClass> RootActor = MakeShareable(new FCustomItemClass("SceneActor"));
TArray<AActor*> AllActors;
UGameplayStatics::GetAllActorsOfClass(World, AActor::StaticClass(), AllActors);
//遍历容器内元素
for (AActor* Actor : AllActors)
{
if (Actor)
{
TSharedPtr<FCustomItemClass> ActorItem = MakeShareable(new FCustomItemClass(Actor->GetName()));
//用于存储和管理场景中的组件数组。它通常用于存储USceneComponent对象,这些对象代表了场景中的各种组件,如网格体、摄像机等。
TInlineComponentArray<UActorComponent*> Components;
Actor->GetComponents(Components);
for (UActorComponent* Component : Components)
{
if (Component)
{
TSharedPtr<FCustomItemClass> ComponentItem = MakeShareable(
new FCustomItemClass(Component->GetName()));
ActorItem->addChild(ComponentItem);
}
}
RootActor->addChild(ActorItem);
}
}
RootItems.Add(RootActor);
}
//这里是最简树形结构的数据示例
TSharedPtr<FCustomItemClass> Root = MakeShareable(new FCustomItemClass("A"));
TSharedPtr<FCustomItemClass> A1 = MakeShareable(new FCustomItemClass("A1"));
TSharedPtr<FCustomItemClass> A2 = MakeShareable(new FCustomItemClass("A1_1"));
Root->addChild(A1);
A1->addChild(A2);
RootItems.Add(Root);
ChildSlot
[
SAssignNew(TreeViewWidget, STreeView<TSharedPtr<FCustomItemClass>>)
.TreeItemsSource(&RootItems)
.OnGenerateRow(this, &SCustomOutliner::OnGenerateRow)
.OnGetChildren(this, &SCustomOutliner::OnGetChildren)
];
}
TSharedRef<ITableRow> SCustomOutliner::OnGenerateRow(TSharedPtr<FCustomItemClass> Item,
const TSharedRef<STableViewBase>& OwnerTable)
{
return SNew(STableRow<TSharedPtr<FCustomItemClass>>, OwnerTable)
[
SNew(STextBlock).Text(FText::FromString(Item->Name))
];
}
void SCustomOutliner::OnGetChildren(TSharedPtr<FCustomItemClass> Item,
TArray<TSharedPtr<FCustomItemClass>>& OutChildren)
{
OutChildren = Item->Children;
}
显示(调用)方法
return SNew(SDockTab) .TabRole(ETabRole::PanelTab) .Label(FText::FromString("OutlinerTabLabel")) //使用宏DefineLabel .ToolTipText(FText::FromString("OutlinerTabToolTip")) [ //创建一个树形结构类的实例 SNew(SCustomOutliner) ];