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);
}
相关推荐
曼巴UE518 小时前
UE5 客户端 需要的网络同步概念总结(3 )-事件同步 RPC 以及三种调用方式
网络·c++·网络协议·学习·rpc·ue5
归真仙人3 天前
【UE项目迁移银河麒麟(Linux)局域网会话搜索失败排查】
ue5·ue4·vr·unreal engine·银河麒麟
fanfan_hongyun5 天前
UE5.1 应用InWebSocketClient-main 接收websocket信息
ue5
远离UE46 天前
Chaos、WFC 与 FJA 原理与区别笔记
ue5
平行云6 天前
3D应用推流太贵太慢?ImmerShare Lite:利用本地算力实现极简一键分享
unity·ue5·实时云渲染·云桌面·像素流·云游戏·串流
fanfan_hongyun7 天前
UE5.1 VaRest插件 读取json http请求
ue5
SpiderCodeJ7 天前
【UE5】- UE MCP :在UE5.8编辑器中内置链接Codex
ue5·codex·智能体·mcp
weixin_4046793110 天前
ue5 widget 之间的蓝图通讯
ue5
zr想努力11 天前
GAS学习(UE5自用)
学习·ue5
平行云11 天前
国产GPU云渲染适配实战:驱动兼容、编码调优与多路并发
unity·ue5·webrtc·webgl·实时云渲染·云桌面·像素流送