当前位置: 首页 > news >正文

【UE工具向】如何优雅的扩展DataTable ToolBar

如何优雅的向DataTable上方ToolBar区域新增功能按钮

近期终于抽出空来把之前做的一些小东西整理出来,希望能对你有帮助

  • 问题背景:只要是大量使用DT的项目我想都会遇到想要"一键处理XXX"的需求,比如是一键打开表格配置的蓝图,一键运行表格配置合法性检查等等。问题随之而来,如何优雅的扩展增加按钮,总不能是来个需求都往引擎源码里加,这有点痛苦,而且还要求对如何扩展引擎编辑器有基本的了解。

基础思路

  • 朴素的想法是不同表格有不同的需求,那么最好按钮由每张表格自己决定
  • 最好加按钮的人不需要了解引擎如何扩展,不需要改引擎代码,只在对应表格代码中处理相关逻辑

说干就干

  • 引擎中新增一个扩展按钮信息结构体

    // 在DataTable.h新增
    USTRUCT(BlueprintType)
    struct FDTExtendToolBarBtnInfo
    {GENERATED_BODY()
    public:FDTExtendToolBarBtnInfo() = default;FDTExtendToolBarBtnInfo(FString InLabel, FString InFuncType, FString InToolTip): Label(InLabel), FuncType(InFuncType), ToolTip(InToolTip){}bool operator==(const FDTExtendToolBarBtnInfo& Other) const{return Label == Other.Label && FuncType == Other.FuncType;}UPROPERTY()FString Label = "TestExtendBtn";UPROPERTY()FString FuncType = "Test";UPROPERTY()FString ToolTip = "ToolBar tool tip";UPROPERTY()FString IconStyleSet = "EditorStyle";UPROPERTY()FString IconStyle = "ContentBrowser.ImportPackage";
    };
    
  • 从 GetLifetimeReplicatedProps() 得到灵感,在TableRowBase表行基类结构体中增加虚函数,从子类表行中获取要增加的扩展按钮信息

    // DataTable.h中 FTableRowBase 中增加虚函数
    #if WITH_EDITOR
    // 这里新增虚函数,由子类各自塞入扩展信息
    virtual void GetExtendToolBars(TArray<FDTExtendToolBarBtnInfo>& OutExtendToolBars) { };
    // 按钮回调事件
    virtual void OnExtendToolBarBtnClicked(const FString InBtnType) { };
    #endif // WITH_EDITOR
    
  • 由DataTableEditor获取到之后统一注册扩展,绑定回调函数到对应的表行,去执行不同的处理逻辑

    // DataTable.h中 FDataTableEditor::FillToolbar(FToolBarBuilder& ToolbarBuilder)函数中统一注册增加当前表格的扩展按钮
    // 自定义增加ToolBar按钮
    ToolbarBuilder.BeginSection("CustomDTCommands");
    {const UDataTable* ViewTable = GetDataTable();if (ViewTable && HighlightedRowName.IsValid()){auto RowData = ViewTable->FindRow<FTableRowBase>(HighlightedRowName, "");if (!RowData){return;}TArray<FDTExtendToolBarBtnInfo> ExtendBtnInfos;RowData->GetExtendToolBars(ExtendBtnInfos); // 从子类获取for (const auto& BtnInfo : ExtendBtnInfos){FString FuncType = BtnInfo.FuncType;ToolbarBuilder.AddToolBarButton(FUIAction(FExecuteAction::CreateLambda([this, FuncType]() {const UDataTable* ViewTable = GetDataTable();if (ViewTable && HighlightedRowName.IsValid()){auto RowData = ViewTable->FindRow<FTableRowBase>(HighlightedRowName, "");if (RowData){RowData->OnExtendToolBarBtnClicked(FuncType); // 回调到子类}}})),NAME_None,TAttribute(FText::FromString(BtnInfo.Label)),TAttribute(FText::FromString(BtnInfo.ToolTip)),FSlateIcon(FName(BtnInfo.IconStyleSet), FName(BtnInfo.IconStyle)));}}
    }
    ToolbarBuilder.EndSection();
    

    牛刀小试

    • 我们随意找一个表行结构体来试验,扩展一个按钮仅需要几行代码,添加按钮的代码是简单而固定的。对于执行同学来说,只需要关注回调函数中自己的处理逻辑即可。
      img
      img
    • 引擎内效果
      img
http://www.jsqmd.com/news/29443/

相关文章:

  • 亲爱的伊利斯
  • go清单
  • MySQL_进阶
  • 团队项目1-团队展示选题-星瀚餐递
  • 2025-11-02 闲话
  • DRL-SARSA
  • 2025.10.20~2025.10.26
  • Day10复合选择器
  • 2025.10.27~2025.11.02
  • 一次 Windows 内核卡住的调试经历
  • SQCTF-web
  • websocket在秒杀场景下连接过多的问题
  • 团队作业1-团队展示与选题
  • 每日一题:第474场周赛 Q1. 找出缺失的元素
  • 每日一题:第474场周赛 Q1. 找出缺失的元素
  • 软件技术基础
  • I2C to 16-Bit GPIO Expander with Interrupt TPT29555A
  • 国产化数据库迁移工具不会用?教你手搓一个万能数据迁移工具。
  • 【UE引擎解构】- 引擎基础 :基本组件
  • 思维的“幽灵显影”:神经科学捕捉意义重燃的独特签名
  • 搜索百科(6):Meilisearch — Rust 打造的轻量级搜索新锐
  • 软件工程--团队作业
  • C++练习1
  • 2025.11.2总结
  • claude_code_clone
  • 第二届数证杯初赛-计算机取证
  • 视频瘦身大师
  • 如何把应用程序的图标都摆在xfce的panel上
  • 读《纳瓦尔宝典》之判断力:一
  • 团队作业