[{"data":1,"prerenderedAt":104},["ShallowReactive",2],{"\u002F2015-09-11-uwidget-wrap-swidget-to-umg":3},{"id":4,"title":5,"body":6,"date":79,"description":12,"extension":80,"meta":81,"navigation":84,"path":96,"seo":97,"stem":98,"tags":99,"__hash__":103},"blogs\u002F_legacy\u002F2015\u002F2015-09-11-uwidget-wrap-swidget-to-umg.md","UWidget封装SWidget到UMG",{"type":7,"value":8,"toc":75},"minimark",[9,13,16,19,22,25,28,31,42,45,48,54,57,60,63,66,69,72],[10,11,12],"p",{},"为了使用UMG中的一些高级或便利特性，需要将制作好的Slate控件封装到UWidget中去。",[10,14,15],{},"当前UE4版本4.8.3。",[10,17,18],{},"将Slate封装到UMG中去有很多的好处，因为在代码中对需要重用的控件进行不断的重新布局是一件非常繁琐的事情。同时，UMG也有在3D空间中进行显示这样的高级功能。",[10,20,21],{},"由于UMG本身就是对Slate的封装，所以这个过程可以参照UE4的源代码进行研究。",[10,23,24],{},"这里所做的是尝试对上一回所做的文件目录树进行封装。",[10,26,27],{},"直接上代码",[10,29,30],{},"CListViewWidget.h",[32,33,38],"pre",{"className":34,"code":36,"language":37},[35],"language-text","#pragma once\n#include \"CListViewWidget.generated.h\"\nUCLASS()\nclass TEST_MP_API UCListViewWidget : public UWidget\n{\n  GENERATED_UCLASS_BODY()\npublic:\n\n#if WITH_EDITOR\n  \u002F\u002F UWidget interface\n  virtual const FSlateBrush* GetEditorIcon() override;\n  virtual const FText GetPaletteCategory() override;\n  virtual void OnCreationFromPalette() override;\n  \u002F\u002F End UWidget interface\n#endif\n\nprotected:\n  \u002F\u002F UWidget interface\n  virtual TSharedRef\u003CSWidget> RebuildWidget() override;\n  virtual void OnBindingChanged(const FName& Property) override;\n  \u002F\u002F End of UWidget interface\n\nprotected:\n  TSharedPtr\u003Cclass SDDFileTree> MyFileTree;\n};\n","text",[39,40,36],"code",{"__ignoreMap":41},"",[10,43,44],{},"封装类直接继承自UWidget即可，剩下的就是对UWidget中的函数进行实现。",[10,46,47],{},"CListViewWidget.cpp",[32,49,52],{"className":50,"code":51,"language":37},[35],"#include \"Test_mp.h\"\n#include \"SDDFileTree.h\"\n#include \"CListViewWidget.h\"\n\n\u002F** GENERATED_UCLASS_BODY() *\u002F\nUCListViewWidget::UCListViewWidget(const FObjectInitializer& ObjectInitializer)\n: Super(ObjectInitializer)\n{\n  bIsVariable = false;\n}\n\n\u002F** \u003C编辑器属性 *\u002F\n#if WITH_EDITOR\n\n\u002F\u002F \u003C图标\nconst FSlateBrush* UCListViewWidget::GetEditorIcon()\n{\n  return FUMGStyle::Get().GetBrush(\"Widget.TextBlock\");\n}\n\n\u002F\u002F \u003C分类目录\nconst FText UCListViewWidget::GetPaletteCategory()\n{\n  return NSLOCTEXT(\"Testmp\", \"Custom\", \"Ch_Custom\");\n}\n\n\u002F\u002F \u003C创建时的默认值\nvoid UCListViewWidget::OnCreationFromPalette()\n{\n;\n}\n\n#endif\n\nTSharedRef\u003CSWidget> UCListViewWidget::RebuildWidget()\n{\n  MyFileTree = SNew(SDDFileTree).OwnerHUD(nullptr);\n\n  return MyFileTree.ToSharedRef();\n}\n\nvoid UCListViewWidget::OnBindingChanged(const FName& Property)\n{\n  Super::OnBindingChanged(Property);\n\n  if (MyFileTree.IsValid())\n  {\n    ;\n  }\n}\n",[39,53,51],{"__ignoreMap":41},[10,55,56],{},"在所有的函数中，RebuildWidget()是最重要的。",[10,58,59],{},"参看UWidget的源代码可以发现，所有对被封装的SWidget的引用都是通过这个函数获得的，因此在这里面写上SWidget对应的构造生成就可以了。",[10,61,62],{},"OnBindingChanged函数是用于属性代理通知的，这里是简单的封装，没有提供属性代理，因此直接return也是可以的。",[10,64,65],{},"在WITH_EDITOR宏中的是编辑器属性，用于封装后的UWidget在蓝图编辑器中显示。具体每一个函数的含义已经在注释中了。",[10,67,68],{},"将上面的代码编译通过之后，就可以在UMG的编辑器中看到我们添加的控件了：",[10,70,71],{},"将CListViewWidget拖动到控件蓝图上，并在HUD中展示此控件蓝图，就能在项目中与其他UMG控件一样使用了：",[10,73,74],{},"这样以来Slate的使用就会变得方便很多。",{"title":41,"searchDepth":76,"depth":77,"links":78},2,3,[],"2015-09-11","md",{"layout":82,"status":83,"published":84,"author":85,"author_login":86,"author_email":87,"author_url":88,"wordpress_id":89,"wordpress_url":90,"date_gmt":91,"excerpt":92},"post","publish",true,{"display_name":86,"login":86,"email":87,"url":88},"chaoshikari","chaoshikari@gmail.com","\u002F",1457,"\u002F\u002F?p=1457","2015-09-11 11:11:13 +0000",{"type":7,"value":93},[94],[10,95,12],{},"\u002F2015-09-11-uwidget-wrap-swidget-to-umg",{"title":5,"description":12},"_legacy\u002F2015\u002F2015-09-11-uwidget-wrap-swidget-to-umg",[100,101,102],"UE4","UMG","Slate","mPzjKCXtbWWXkWThfinkYHexD0dpoqD6gvqKCUaR4v0",1788763180608]