1. 主菜单的按钮

参考https://alanwalk.github.io/2018/04/17/how-to-add-ue4-editor-menu/

2. Tab上的按钮

3. Tab上的菜单怎么构建呢?

主要是构建菜单栏的SWidge,然后添加到最上面的布局中就可以了。

所有的菜单栏,都是通过FExtender构建的,

TSharedRef< SWidget >  FTestEditorModule::Test()
{inTabMgr = FGlobalTabmanager::Get();TSharedPtr<FExtender> MenuBarExtender = MakeShareable(new FExtender());MenuBarExtender->AddMenuBarExtension("Help",EExtensionHook::After,NULL,FMenuBarExtensionDelegate::CreateRaw(this, &FTestEditorModule::AddMenuBarExtension));FTestEditorModule& TestEditorModule = FModuleManager::LoadModuleChecked<FTestEditorModule>(TestEditorTabName);MenuExtensibilityManager->AddExtender(MenuBarExtender);IMainFrameModule& MainFrameModule = FModuleManager::LoadModuleChecked<IMainFrameModule>( "MainFrame" );TSharedRef< SWidget > MenuBarWidget = MainFrameModule.MakeMainTabMenu( inTabMgr, MenuBarExtender.ToSharedRef() );return MenuBarWidget;
}

这里构建MenuBarExtender之后,使用的是 MainFrameModule.MakeMainTabMenu构建了SWidget,看一下创建的代码


TSharedRef< SWidget > FMainMenu::MakeMainTabMenu( const TSharedPtr<FTabManager>& TabManager, const TSharedRef< FExtender > UserExtender )
{   struct Local{static void FillProjectMenuItems( FMenuBuilder& MenuBuilder ){MenuBuilder.BeginSection( "FileProject", LOCTEXT("ProjectHeading", "Project") );{MenuBuilder.AddMenuEntry( FMainFrameCommands::Get().NewProject );MenuBuilder.AddMenuEntry( FMainFrameCommands::Get().OpenProject );FText ShortIDEName = FSourceCodeNavigation::GetSelectedSourceCodeIDE();MenuBuilder.AddMenuEntry( FMainFrameCommands::Get().AddCodeToProject,NAME_None,TAttribute<FText>(),FText::Format(LOCTEXT("AddCodeToProjectTooltip", "Adds C++ code to the project. The code can only be compiled if you have {0} installed."), ShortIDEName));MenuBuilder.AddSubMenu(LOCTEXT("PackageProjectSubMenuLabel", "Package Project"),LOCTEXT("PackageProjectSubMenuToolTip", "Compile, cook and package your project and its content for distribution."),FNewMenuDelegate::CreateStatic( &FPackageProjectMenu::MakeMenu ), false, FSlateIcon(FEditorStyle::GetStyleSetName(), "MainFrame.PackageProject"));/*MenuBuilder.AddMenuEntry( FMainFrameCommands::Get().LocalizeProject,NAME_None,TAttribute<FText>(),LOCTEXT("LocalizeProjectToolTip", "Gather text from your project and import/export translations."));*//*MenuBuilder.AddSubMenu(LOCTEXT("CookProjectSubMenuLabel", "Cook Project"),LOCTEXT("CookProjectSubMenuToolTip", "Cook your project content for debugging"),FNewMenuDelegate::CreateStatic( &FCookContentMenu::MakeMenu ), false, FSlateIcon());*/FString SolutionPath;if (FSourceCodeNavigation::DoesModuleSolutionExist()){MenuBuilder.AddMenuEntry( FMainFrameCommands::Get().RefreshCodeProject,NAME_None,FText::Format(LOCTEXT("RefreshCodeProjectLabel", "Refresh {0} Project"), ShortIDEName),FText::Format(LOCTEXT("RefreshCodeProjectTooltip", "Refreshes your C++ code project in {0}."), ShortIDEName));MenuBuilder.AddMenuEntry( FMainFrameCommands::Get().OpenIDE,NAME_None,FText::Format(LOCTEXT("OpenIDELabel", "Open {0}"), ShortIDEName),FText::Format(LOCTEXT("OpenIDETooltip", "Opens your C++ code in {0}."), ShortIDEName));}else{MenuBuilder.AddMenuEntry( FMainFrameCommands::Get().RefreshCodeProject,NAME_None,FText::Format(LOCTEXT("GenerateCodeProjectLabel", "Generate {0} Project"), ShortIDEName),FText::Format(LOCTEXT("GenerateCodeProjectTooltip", "Generates your C++ code project in {0}."), ShortIDEName));}// @hack GDC: this should be moved somewhere else and be less hackyITargetPlatform* RunningTargetPlatform = GetTargetPlatformManager()->GetRunningTargetPlatform();if (RunningTargetPlatform != nullptr){const FName CookedPlatformName = *(RunningTargetPlatform->PlatformName() + TEXT("NoEditor"));const FText CookedPlatformText = FText::FromString(RunningTargetPlatform->PlatformName());FUIAction Action(FExecuteAction::CreateStatic(&FMainFrameActionCallbacks::CookContent, CookedPlatformName),FCanExecuteAction::CreateStatic(&FMainFrameActionCallbacks::CookContentCanExecute, CookedPlatformName));MenuBuilder.AddMenuEntry(FText::Format(LOCTEXT("CookContentForPlatform", "Cook Content for {0}"), CookedPlatformText),FText::Format(LOCTEXT("CookContentForPlatformTooltip", "Cook your game content for debugging on the {0} platform"), CookedPlatformText),FSlateIcon(),Action);}}MenuBuilder.EndSection();}static void FillRecentFileAndExitMenuItems( FMenuBuilder& MenuBuilder ){MenuBuilder.BeginSection("FileRecentFiles");{if (GetDefault<UEditorStyleSettings>()->bShowProjectMenus && FMainFrameActionCallbacks::ProjectNames.Num() > 0){MenuBuilder.AddSubMenu(LOCTEXT("SwitchProjectSubMenu", "Recent Projects"),LOCTEXT("SwitchProjectSubMenu_ToolTip", "Select a project to switch to"),FNewMenuDelegate::CreateStatic(&FRecentProjectsMenu::MakeMenu), false, FSlateIcon(FEditorStyle::GetStyleSetName(), "MainFrame.RecentProjects"));}}MenuBuilder.EndSection();#if !PLATFORM_MAC // Handled by app's menu in menu barMenuBuilder.AddMenuSeparator();MenuBuilder.AddMenuEntry( FMainFrameCommands::Get().Exit, "Exit" );
#endif}};FExtensibilityManager ExtensibilityManager;ExtensibilityManager.AddExtender( UserExtender );{TSharedRef< FExtender > Extender( new FExtender() );IMainFrameModule& MainFrameModule = FModuleManager::GetModuleChecked<IMainFrameModule>("MainFrame");if (GetDefault<UEditorStyleSettings>()->bShowProjectMenus){Extender->AddMenuExtension("FileLoadAndSave",EExtensionHook::After,MainFrameModule.GetMainFrameCommandBindings(),FMenuExtensionDelegate::CreateStatic(&Local::FillProjectMenuItems));}Extender->AddMenuExtension("FileLoadAndSave",EExtensionHook::After,MainFrameModule.GetMainFrameCommandBindings(),FMenuExtensionDelegate::CreateStatic( &Local::FillRecentFileAndExitMenuItems ) );ExtensibilityManager.AddExtender( Extender );}TSharedRef< SWidget > MenuBarWidget = FMainMenu::MakeMainMenu( TabManager, ExtensibilityManager.GetAllExtenders().ToSharedRef() );return MenuBarWidget;
}TSharedRef<SWidget> FMainMenu::MakeMainMenu(const TSharedPtr<FTabManager>& TabManager, const TSharedRef< FExtender > Extender)
{
#define LOCTEXT_NAMESPACE "MainMenu"// Cache all project names onceFMainFrameActionCallbacks::CacheProjectNames();FMenuBarBuilder MenuBuilder(FMainFrameCommands::ActionList, Extender);{// FileMenuBuilder.AddPullDownMenu( LOCTEXT("FileMenu", "File"),LOCTEXT("FileMenu_ToolTip", "Open the file menu"),FNewMenuDelegate::CreateStatic(&FMainMenu::FillFileMenu, Extender),"File",FName(TEXT("FileMenu")));// EditMenuBuilder.AddPullDownMenu( LOCTEXT("EditMenu", "Edit"),LOCTEXT("EditMenu_ToolTip", "Open the edit menu"),FNewMenuDelegate::CreateStatic(&FMainMenu::FillEditMenu, Extender, TabManager),"Edit",FName(TEXT("EditMenu")));// WindowMenuBuilder.AddPullDownMenu(LOCTEXT("WindowMenu", "Window"),LOCTEXT("WindowMenu_ToolTip", "Open new windows or tabs."),FNewMenuDelegate::CreateStatic(&FMainMenu::FillWindowMenu, Extender, TabManager),"Window");// HelpMenuBuilder.AddPullDownMenu( LOCTEXT("HelpMenu", "Help"),LOCTEXT("HelpMenu_ToolTip", "Open the help menu"),FNewMenuDelegate::CreateStatic(&FMainMenu::FillHelpMenu, Extender),"Help");}// Create the menu bar!TSharedRef<SWidget> MenuBarWidget = MenuBuilder.MakeWidget();// Tell tab-manager about the multi-box for platforms with a global menu barTabManager->SetMenuMultiBox(MenuBuilder.GetMultiBox());return MenuBarWidget;
}

最后是构建了一个MenuBarWidget,如果需要自定义Menu,可以参考着个代码自己创建一个函数。

这里自动构建了一个Menu bar。

最后添加到Widget中

4. Tab上的ToolBar

// 创建的代码
TSharedRef<FUICommandList> CommandList = MakeShareable(new FUICommandList);
FToolBarBuilder ToolbarBuilder( CommandList, FMultiBoxCustomization::None );
ToolbarBuilder.BeginSection("CurveEditorFit");
{ToolbarBuilder.AddToolBarButton(FProEditorCommands::Get().OpenPluginWindow);ToolbarBuilder.AddToolBarButton(FProEditorCommands::Get().OpenPluginWindow);ToolbarBuilder.AddToolBarButton(FProEditorCommands::Get().OpenPluginWindow);
}
ToolbarBuilder.EndSection();
return SNew(SDockTab).TabRole(ETabRole::NomadTab)[// Put your tab content here!SNew(SVerticalBox)+SVerticalBox::Slot().MaxHeight(50)[ToolbarBuilder.MakeWidget()]]

也是获取ToolBarBuilder的布局,然后加入父类的布局中

(四)UE4编辑器菜单按钮相关推荐

  1. 编辑按钮 php,自定义百度编辑器菜单按钮

    首先打开自定义字段中的百度编辑器字段属性,如下图 选择自定义,然后在工具栏中写上想要的按钮英文字符,格式如下:'按钮字母', '按钮字母2', '按钮字母3' 完整的按钮表:'undo', 'redo ...

  2. 【微信公众号开发】四、公众号按钮设置及自己的微信按钮编辑器

    文章详情:[微信公众号开发]四.公众号按钮设置及自己的微信按钮编辑器 链接:https://www.microanswer.cn/blog/14

  3. SRPG游戏开发(三十四)第八章 游戏中的数据 - 四 数据编辑器(Data Editor)

    返回总目录 第八章 游戏中的数据(Data in Game) 在之前的章节中,我们进行地图对象的生成,移动等操作. 这一章本来可以进行战斗的编写,不过数据缺失是一个问题. 所以这一章我们先来建立一些数 ...

  4. [unreal4入门系列之八] 使用VS编译UE4编辑器并添加物体到场景中

    接下来,我们将会创建一个放置我们的游戏角色的基本场景. 编译UE4编辑器 1) 现在,我们创建一个空白的UE4项目来开始.首先点击桌面的Epic Games Launcher,打开启动器,点击左上角的 ...

  5. Vue + Element UI 实现权限管理系统:页面权限控制(菜单 + 按钮)

    权限控制方案 既然是后台权限管理系统,当然少不了权限控制啦,至于权限控制,前端方面当然就是对页面资源的访问和操作控制啦. 前端资源权限主要又分为两个部分,即导航菜单的查看权限和页面增删改操作按钮的操作 ...

  6. css3 javascript 实现菜单按钮特效

    一个菜单按钮特效案例,简单的实现了动态效果. 代码效果预览地址: http://code.w3ctech.com/detail/2504 <div class="bar" i ...

  7. 按钮 交互_SwiftUI中的微交互—菜单按钮动画

    按钮 交互 Microinteractions have become increasingly important in a world with a dizzying number of digi ...

  8. android 按钮 菜单,(期末要考啊)Android的menu(菜单)按钮的使用

    (期末要考啊)Android的menu(菜单)按钮的使用 安卓 Android的菜单按钮 使用xml的方式创建菜单项在res下的menu目录下新建一个main.xml文件,以menu为根节点,添加一个 ...

  9. html5列表菜单特效,HTML5 SVG汉堡包菜单按钮分段动画特效

    这是一款效果非常炫酷的HTML5 SVG汉堡包菜单按钮分段动画特效.该菜单按钮特效在用户点击汉堡包按钮时,按钮会分割为多段,并旋转变形为关闭按钮的状态.当再次点击该按钮时,它会逆向变形为汉堡包图标. ...

最新文章

  1. Windows 7+Code::Blocks+wxWidgets实录(一)
  2. 2017-1-7 html元素分类(1)
  3. 最近一段时间开发客户端app的感悟
  4. auuc 评估指标_广告中增益模型理解
  5. android硬编码封装mp4,【Android 音视频开发打怪升级:音视频硬解码篇】四、音视频解封和封装:生成一个MP4...
  6. UI5 table display visible row count logic calculation calculate
  7. Android—AspectJ实践
  8. 本地方法(JNI)——编码签名
  9. ftp服务器复制粘贴文件夹,ftp服务器复制粘贴文件夹
  10. Eclipse导入GitHub上面项目的两处报错处理
  11. python机器学习库keras——CNN卷积神经网络识别手写体
  12. 【原创】SM4password算法源代码接口具体解释
  13. Keras基础项目实践
  14. Failed to push selection: Read-only file system
  15. js 设置cookie
  16. 动态修改svg图片颜色
  17. Bussiness 2.0:IT行业新近出现的五大新职业
  18. 荣耀magic3pro和华为p50pro对比哪个好
  19. 解决pip install d2l失败的问题
  20. MSP430 5xx/6xx 定时器A增计数模式编程实例

热门文章

  1. mysql sde_sde用sql实现erase_MySQL
  2. linux系统ata1.00,linux – 哪个硬盘对应ata1.00和ata12.00?
  3. 视频字幕如何提取出来?这篇文章告诉你怎么提取
  4. 【日语论文】新干线对日本旅游业发展的影响-以秋田新干线为例(节选)
  5. android 应用
  6. React支持IE9/10/11
  7. 6G及太赫兹关键技术
  8. Shader常用函数属性
  9. implode和explode
  10. 公务员考试催生一家上市公司,公务员真的是一条好的出路吗