• U++ Slate学习笔记 ------ Editor Standalone Window


    创建成功效果如下(我名字为Test):

    插件名叫SimpleWindow,所以生成4个文件夹名为:Test.h、TestCommand.h、TestStyle.h及其cpp,记忆Test.Build.cs

    Test类:为插件主类,插件的入口和出口都在此类中

    TestCommand类:注册一个OpenPluginWindow的命令

    TestStyle类:定义UI样式的类


    1. // Copyright 1998-2017 Epic Games, Inc. All Rights Reserved.
    2. #include "Test.h"
    3. #include "TestStyle.h"
    4. #include "TestCommands.h"
    5. #include "LevelEditor.h"
    6. #include "Widgets/Docking/SDockTab.h"
    7. #include "Widgets/Layout/SBox.h"
    8. #include "Widgets/Text/STextBlock.h"
    9. #include "Framework/MultiBox/MultiBoxBuilder.h"
    10. static const FName TestTabName("Test");
    11. #define LOCTEXT_NAMESPACE "FTestModule"
    12. void FTestModule::StartupModule()
    13. {
    14. // This code will execute after your module is loaded into memory; the exact timing is specified in the .uplugin file per-module
    15. FTestStyle::Initialize();//初始化UI样式
    16. FTestStyle::ReloadTextures();//初始化UI样式
    17. FTestCommands::Register();//注册命令
    18. PluginCommands = MakeShareable(new FUICommandList);//实例化一个命令
    19. PluginCommands->MapAction(//将实例化的命令进行绑定,且绑定到函数FTestModule::PluginButtonClicked
    20. FTestCommands::Get().OpenPluginWindow,
    21. FExecuteAction::CreateRaw(this, &FTestModule::PluginButtonClicked),
    22. FCanExecuteAction());
    23. FLevelEditorModule& LevelEditorModule = FModuleManager::LoadModuleChecked<FLevelEditorModule>("LevelEditor");//获取LevelEditor模块的引用
    24. {
    25. TSharedPtr<FExtender> MenuExtender = MakeShareable(new FExtender());//创建一个菜单扩展,并把它添加到场景编辑器中
    26. MenuExtender->AddMenuExtension("WindowLayout", EExtensionHook::After, PluginCommands, FMenuExtensionDelegate::CreateRaw(this, &FTestModule::AddMenuExtension));
    27. LevelEditorModule.GetMenuExtensibilityManager()->AddExtender(MenuExtender);
    28. }
    29. {
    30. TSharedPtr<FExtender> ToolbarExtender = MakeShareable(new FExtender);//创建一个菜单扩展,并添加到工具栏
    31. ToolbarExtender->AddToolBarExtension("Settings", EExtensionHook::After, PluginCommands, FToolBarExtensionDelegate::CreateRaw(this, &FTestModule::AddToolbarExtension));
    32. LevelEditorModule.GetToolBarExtensibilityManager()->AddExtender(ToolbarExtender);
    33. }
    34. FGlobalTabmanager::Get()->RegisterNomadTabSpawner(TestTabName, FOnSpawnTab::CreateRaw(this, &FTestModule::OnSpawnPluginTab))//注册一个Tab容器
    35. .SetDisplayName(LOCTEXT("FTestTabTitle", "Test"))
    36. .SetMenuType(ETabSpawnerMenuType::Hidden);
    37. }
    38. void FTestModule::ShutdownModule()
    39. {
    40. // This function may be called during shutdown to clean up your module. For modules that support dynamic reloading,
    41. // we call this function before unloading the module.
    42. FTestStyle::Shutdown();
    43. FTestCommands::Unregister();
    44. FGlobalTabmanager::Get()->UnregisterNomadTabSpawner(TestTabName);
    45. }
    46. TSharedRef<SDockTab> FTestModule::OnSpawnPluginTab(const FSpawnTabArgs& SpawnTabArgs)
    47. {
    48. FText WidgetText = FText::Format(
    49. LOCTEXT("WindowWidgetText", "Add code to {0} in {1} to override this window's contents"),
    50. FText::FromString(TEXT("FTestModule::OnSpawnPluginTab")),
    51. FText::FromString(TEXT("Test.cpp"))
    52. );
    53. return SNew(SDockTab)
    54. .TabRole(ETabRole::NomadTab)
    55. [
    56. // Put your tab content here!
    57. SNew(SBox)
    58. .HAlign(HAlign_Center)
    59. .VAlign(VAlign_Center)
    60. [
    61. SNew(STextBlock)
    62. .Text(WidgetText)
    63. ]
    64. ];
    65. }
    66. void FTestModule::PluginButtonClicked()
    67. {
    68. FGlobalTabmanager::Get()->InvokeTab(TestTabName);
    69. }
    70. void FTestModule::AddMenuExtension(FMenuBuilder& Builder)
    71. {
    72. Builder.AddMenuEntry(FTestCommands::Get().OpenPluginWindow);
    73. }
    74. void FTestModule::AddToolbarExtension(FToolBarBuilder& Builder)
    75. {
    76. Builder.AddToolBarButton(FTestCommands::Get().OpenPluginWindow);
    77. }
    78. #undef LOCTEXT_NAMESPACE
    79. IMPLEMENT_MODULE(FTestModule, Test)

    在工具栏点击按钮时,因为以下代码让ToolbarExtension与PluginCommands关联,PluginCommands执行的函数是&FTestModule::PluginButtonClicked,所以当点击按钮后,执行的是该函数

    1. FTestCommands::Register();//注册命令
    2. PluginCommands = MakeShareable(new FUICommandList);//实例化一个命令
    3. PluginCommands->MapAction(//将实例化的命令进行绑定,且绑定到函数FTestModule::PluginButtonClicked
    4. FTestCommands::Get().OpenPluginWindow,
    5. FExecuteAction::CreateRaw(this, &FTestModule::PluginButtonClicked),
    6. FCanExecuteAction());
    7. FLevelEditorModule& LevelEditorModule = FModuleManager::LoadModuleChecked<FLevelEditorModule>("LevelEditor");//获取LevelEditor模块的引用
    8. TSharedPtr<FExtender> ToolbarExtender = MakeShareable(new FExtender);//创建一个菜单扩展,并添加到工具栏
    9. ToolbarExtender->AddToolBarExtension("Settings", EExtensionHook::After, PluginCommands, FToolBarExtensionDelegate::CreateRaw(this, &FTestModule::AddToolbarExtension));
    10. LevelEditorModule.GetToolBarExtensibilityManager()->AddExtender(ToolbarExtender);

    PluginButtonClicked里调用了FGlobalTabmanager的Invoke函数,因为在StartupModule里,已经注册了Tab了,InvokeTab函数会启动这个Tab,而Tab在注册时已经绑定了&FTestModule::OnSpawnPluginTab这个函数,所以InvokeTab去调用该函数去了

    1. FGlobalTabmanager::Get()->RegisterNomadTabSpawner(TestTabName, FOnSpawnTab::CreateRaw(this, &FTestModule::OnSpawnPluginTab))//注册一个Tab容器
    2. .SetDisplayName(LOCTEXT("FTestTabTitle", "Test"))
    3. .SetMenuType(ETabSpawnerMenuType::Hidden);
    4. void FTestModule::PluginButtonClicked()
    5. {
    6. FGlobalTabmanager::Get()->InvokeTab(TestTabName);
    7. }

    在OnSpawnPluginTab内部,实现了具体UI

    1. TSharedRef<SDockTab> FTestModule::OnSpawnPluginTab(const FSpawnTabArgs& SpawnTabArgs)
    2. {
    3. FText WidgetText = FText::Format(
    4. LOCTEXT("WindowWidgetText", "Add code to {0} in {1} to override this window's contents"),
    5. FText::FromString(TEXT("FTestModule::OnSpawnPluginTab")),
    6. FText::FromString(TEXT("Test.cpp"))
    7. );
    8. return SNew(SDockTab)
    9. .TabRole(ETabRole::NomadTab)
    10. [
    11. // Put your tab content here!
    12. SNew(SBox)
    13. .HAlign(HAlign_Center)
    14. .VAlign(VAlign_Center)
    15. [
    16. SNew(STextBlock)
    17. .Text(WidgetText)
    18. ]
    19. ];
    20. }

  • 相关阅读:
    day2_redis缓存
    mysql详细笔记
    visualstudio中在窗体控件中添加datagridview绑定数据后加载不显示数据的原因及解决办法
    Java程序设计2023-第三次上机测试
    【微服务生态】Docker
    【微信小程序开发】一文带你详解数据处理与交互技术
    wx.getUserProfile is not a function微信小程序报错
    扯淡的DevOps,我们开发根本不想做运维!
    生态系统长期观测数据产品体系
    个股与指数行情走势对比分析 !股票量化分析工具QTYX-V2.5.2
  • 原文地址:https://blog.csdn.net/qqQQqsadfj/article/details/127998443