UE5 Slate中的StreeView的基础创建方法

cpp 复制代码
.h
// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "Widgets/SCompoundWidget.h"

/**
 * 
 */
class MYALONESLATE_API SMyTreeView : public SCompoundWidget
{
public:
	SLATE_BEGIN_ARGS(SMyTreeView)
		{
		}

	SLATE_ARGUMENT(FText,buttontext)

	SLATE_END_ARGS()

	/** Constructs this widget with InArgs */
	void Construct(const FArguments& InArgs);

	TSharedRef<ITableRow> OnGenerateRowForList(TSharedPtr<FString> Item, const TSharedRef<STableViewBase>& OwnerTable);
	void OnGetChildrenForTree(TSharedPtr<FString> Item, TArray<TSharedPtr<FString>>& OutChildren);

private:
	TArray<TSharedPtr<FString>> Items;
	
	TMap<FString, TArray<TSharedPtr<FString>>> ChildrenMap;
};
cpp 复制代码
.cpp

// Fill out your copyright notice in the Description page of Project Settings.


#include "MyTreeView.h"

#include "SlateOptMacros.h"

BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION

void SMyTreeView::Construct(const FArguments& InArgs)
{
	// 初始化根节点
	Items.Add(MakeShared<FString>("thisA"));
	Items.Add(MakeShared<FString>("thisB"));
	Items.Add(MakeShared<FString>("thisC"));

	// 初始化子节点
	ChildrenMap.Add("thisA", TArray<TSharedPtr<FString>>{ MakeShared<FString>("thisAaaa") });
	ChildrenMap.Add("thisB", TArray<TSharedPtr<FString>>{ MakeShared<FString>("thisBaaa"), MakeShared<FString>("thisBbbb") });
	ChildrenMap.Add("thisC", TArray<TSharedPtr<FString>>{ MakeShared<FString>("thisCaaa") });

	ChildSlot
	[
		SNew(STreeView<TSharedPtr<FString>>)
		.TreeItemsSource(&Items) // Items是一个包含TSharedPtr<FString>的数组
		.OnGenerateRow(this, &SMyTreeView::OnGenerateRowForList)
		.OnGetChildren(this, &SMyTreeView::OnGetChildrenForTree)
	];
}

TSharedRef<ITableRow> SMyTreeView::OnGenerateRowForList(TSharedPtr<FString> Item,
	const TSharedRef<STableViewBase>& OwnerTable)
{
	return SNew(STableRow<TSharedPtr<FString>>, OwnerTable)
   [
	   SNew(STextBlock)
	   .Text(FText::FromString(*Item))
	   .Font(FSlateFontInfo(FPaths::EngineContentDir() / TEXT("Slate/Fonts/Roboto-Regular.ttf"), 24)) // 设置字体大小为24
   ];
}

void SMyTreeView::OnGetChildrenForTree(TSharedPtr<FString> Item, TArray<TSharedPtr<FString>>& OutChildren)
{
	const TArray<TSharedPtr<FString>>* FoundChildren = ChildrenMap.Find(*Item);
	if (FoundChildren)
	{
		OutChildren = *FoundChildren;
	}
}




END_SLATE_FUNCTION_BUILD_OPTIMIZATION

STableRowGetExpanderIndentPadding函数控制根节点前的默认图标,要修改需要创建一个继承至STableRow的类,通过重写GetExpanderWidget函数来改变展开和折叠的图标。需要将"ClassIcon.Plus""ClassIcon.Minus"替换为自己的样式。

cpp 复制代码
class SMyTableRow : public STableRow<TSharedPtr<FString>>
{
public:
    SLATE_BEGIN_ARGS(SMyTableRow) {}
    SLATE_END_ARGS()

    void Construct(const FArguments& InArgs, const TSharedRef<STableViewBase>& InOwnerTableView)
    {
        STableRow::Construct(
            STableRow::FArguments()
            .Style(FCoreStyle::Get(), "NoBorder")
            .ShowSelection(false),
            InOwnerTableView);
    }

    virtual TSharedRef<SWidget> GenerateWidgetForColumn(const FName& ColumnName) override
    {
        return SNew(STextBlock).Text(FText::FromString(*Item));
    }

    virtual TSharedRef<SWidget> GetExpanderWidget() override
    {
        return SNew(SImage)
        .Image(this, &SMyTableRow::GetExpanderImage);
    }

    const FSlateBrush* GetExpanderImage() const
    {
        static FSlateBrush PlusImage = FSlateIconFinder::FindIconBrushForClass("ClassIcon.Plus");
        static FSlateBrush MinusImage = FSlateIconFinder::FindIconBrushForClass("ClassIcon.Minus");

        return IsItemExpanded() ? &MinusImage : &PlusImage;
    }
};

然后在OnGenerateRowForList函数中使用SMyTableRow来替换STableRow

TSharedRef<ITableRow> SMyTreeView::OnGenerateRowForList(TSharedPtr<FString> Item, const TSharedRef<STableViewBase>& OwnerTable)
{
    return SNew(SMyTableRow, OwnerTable)
    .Item(Item);
}
相关推荐
draracle8 小时前
如何将 cryptopp库移植到UE5内
ue5
龙智DevSecOps解决方案1 天前
Perforce演讲回顾(上):从UE项目Project Titan,看Helix Core在大型游戏开发中的版本控制与集成使用策略
游戏·ue5·源代码管理·perforce·helix core
我救我自己3 天前
UE5.4.3 录屏回放系统ReplaySystem蓝图版
java·前端·ue5
cainiao0806054 天前
UE4/UE5开发资源
ue5·ue4
charon87785 天前
Unreal 实现建造游戏|地面交互shader
游戏·ue5·游戏引擎·虚幻
周周的Unity小屋5 天前
UE5蓝图实战:动态墙上挖坑与自定义坑尺寸
ue5·蓝图挖坑
@Unity打怪升级7 天前
Unity 与虚幻引擎对比:两大游戏开发引擎的优劣分析
游戏·unity·ue5·游戏引擎·ue4·游戏程序·虚幻
timidcatt8 天前
独立游戏《Project:Survival》UE5C++开发日志0——游戏介绍
c++·游戏·ue5
charon87788 天前
Unreal Engine 5 C++: 插件编写03 | MessageDialog
c++·ue5·游戏引擎·虚幻
charon87789 天前
UE5: Content browser工具编写02
c++·ue5·游戏引擎