【虚幻引擎】UE4 Slate菜单栏(menubar)工具栏(ToolBar)命令集合(TCommands)
创始人
2024-06-02 18:58:30

一、认识菜单栏(MenuBar)、工具栏(ToolBar)

UE4中的菜单栏

 

 UE4中的工具栏

上面这些本质上都是菜单栏和工具栏

二、TCommands 

在UE4中,菜单栏和工具栏本质也是一个Button,点击菜单栏或者工具栏会执行相对应的mingle,而UE4为了方便操作,让菜单按钮执行的事件绑定用了Commands命令绑定的方式。

TCommands:

命令集合,用于声明各种FUICommandInfo和注册FUICommandInfo

FUICommandInfo

命令信息,用于绑定菜单执行的事件(Delegate)

FUICommandList

FUICommandList是命令队列,每个FUICommandInfo绑定委托都得通过FUICommandList的MapAction接口来

#pragma once
#include "CoreMinimal.h"
#include "Framework/Commands/Commands.h"
#include "Styling/SlateStyle.h"class FMyCommands :public TCommands
{
public:FMyCommands() :TCommands(TEXT("MyMenu"), NSLOCTEXT("Contexts", "MyMenu", "MyMenu Test"), NAME_None, FMyCommands::GetStyleSetName()){}virtual void RegisterCommands() override;public:TSharedPtr OpenFileCommand;TSharedPtr CloseFileCommand;TSharedPtr SaveFileCommand;};
TSharedPtr MyCommandList;
void OnClick();FMyCommands::Register();MyCommandList = MakeShareable(new FUICommandList);MyCommandList->MapAction(FMyCommands::Get().OpenFileCommand,FExecuteAction::CreateRaw(this,&SVRLevelEditor::OnClick), FCanExecuteAction());MyCommandList->MapAction(FMyCommands::Get().CloseFileCommand,FExecuteAction::CreateRaw(this, &SVRLevelEditor::OnClick), FCanExecuteAction());MyCommandList->MapAction(FMyCommands::Get().SaveFileCommand, FExecuteAction::CreateRaw(this, &SVRLevelEditor::OnClick), FCanExecuteAction());

三、扩展类FExtend

UE4扩展编辑器按钮都是FExtend来扩展,FExtend提供了AddMenuExtension来扩展Menu,AddMenuBarExtension扩展MenuBar, AddToolBarExtension扩展ToolBar.

  扩展菜单栏的方法:

   一、加载模块

//编辑器的模块加载
FLevelEditorModule& LevelEditorModule = FModuleManager::LoadModuleChecked("LevelEditor");
//动画蓝图的模块加载
IAnimationBlueprintEditorModule& AnimationBlueprintEditorModule = FModuleManager::LoadModuleChecked("AnimationBlueprintEditor");

   二、创建Extender对象

//编辑器扩展已有的菜单栏
TSharedPtr MenuExtender = MakeShareable(new FExtender());MenuExtender->AddMenuExtension("WindowLayout", EExtensionHook::After, MyCommands, FMenuExtensionDelegate::CreateRaw(this, &FMyMenuModule::AddMenuExtension));LevelEditorModule.GetMenuExtensibilityManager()->AddExtender(MenuExtender);
//编辑器扩展新的菜单栏
TSharedPtr MenuBarExtend = MakeShareable(new FExtender());MenuBarExtend->AddMenuBarExtension("Help", EExtensionHook::After, MyCommands, FMenuBarExtensionDelegate::CreateRaw(this, &FMyMenuModule::AdddMenuBarExtend));LevelEditorModule.GetMenuExtensibilityManager()->AddExtender(MenuBarExtend);
//编辑器扩展ToolBar
TSharedPtr ToolbarExtender = MakeShareable(new FExtender);ToolbarExtender->AddToolBarExtension("Settings", EExtensionHook::After, MyCommands, FToolBarExtensionDelegate::CreateRaw(this, &FMyMenuModule::AddToolbarExtension));LevelEditorModule.GetToolBarExtensibilityManager()->AddExtender(ToolbarExtender);

   三、给Extender对象添加扩展属性

   四、将Extender对象绑定到对应模块

//编辑器扩展已有菜单栏
void FMyMenuModule::AddMenuExtension(FMenuBuilder& Builder)
{Builder.BeginSection(TEXT("MyButton"));Builder.AddMenuEntry(FMyCommands::Get().OpenFileCommand);Builder.EndSection();
}
//编辑器扩展新的菜单栏
void FMyMenuModule::AddMenuBarExtension(FMenuBarBuilder& Builder)
{Builder.BeginSection(TEXT("MyMenuButton"));Builder.AddMenuEntry(FMyCommands::Get().SaveFileCommand);Builder.EndSection();
}//编辑器扩展Toolbar
void FMyMenuModule::AddToolBarExtension(FToolBarBuilder& Builder)
{Builder.BeginSection(TEXT("MyToolButton"));Builder.AddMenuEntry(FMyCommands::Get().CloseFileCommand);Builder.EndSection();
}

四、MenuBar和ToolBar扩展下拉菜单

MenBar主要是通过AddPullDownMenu

TSharedRef SVRLevelEditor::MakeMenuBar()
{FMenuBarBuilder MenuBulider(MyCommandList);MenuBulider.AddPullDownMenu(LOCTEXT("MyFile","MyFile"), LOCTEXT("MyMenu", "MyMenu"),FNewMenuDelegate::CreateRaw(this,&SVRLevelEditor::AddPullDownMenu));MenuBulider.AddPullDownMenu(LOCTEXT("MyEditor", "MyEditor"), LOCTEXT("MyMenu", "MyMenu"), FNewMenuDelegate::CreateRaw(this, &SVRLevelEditor::AddPullDownMenu));MenuBulider.AddPullDownMenu(LOCTEXT("MyWindow", "MyWindow"), LOCTEXT("MyMenu", "MyMenu"), FNewMenuDelegate::CreateRaw(this, &SVRLevelEditor::AddPullDownMenu));MenuBulider.AddPullDownMenu(LOCTEXT("MyHelp", "MyHelp"), LOCTEXT("MyMenu", "MyMenu"), FNewMenuDelegate::CreateRaw(this, &SVRLevelEditor::AddPullDownMenu));return MenuBulider.MakeWidget();
}
//创建下拉菜单
void SVRLevelEditor::AddPullDownMenu(FMenuBuilder& Builder)
{//第一个参数是分隔栏的Hook名,第二参数是分隔栏的显示名称Builder.BeginSection("CustomSection", LOCTEXT("CustomArea", "CustomArea"));Builder.AddMenuEntry(FMyCommands::Get().OpenFileCommand);//创建分割线Builder.AddMenuSeparator("SeparatorHook");Builder.AddMenuEntry(FMyCommands::Get().CloseFileCommand);Builder.AddMenuSeparator("SeparatorHook");Builder.AddMenuEntry(FMyCommands::Get().SaveFileCommand);//菜单下拉菜单的子菜单Builder.AddSubMenu(LOCTEXT("SubMenu", "SubMenu"),LOCTEXT("This_is_Sub_Menu", "This is Sub Menu!"),FNewMenuDelegate::CreateRaw(this, &SVRLevelEditor::AddSubMenuExtension),false,FSlateIcon(),true,"SubMenuHook");Builder.EndSection();
}

ToolBar主要是通过AddComboButton添加下拉连续按钮

(1)AddToolBarButton添加工具按钮

(2)AddComboButton添加下拉连续按钮,可以通过FOnGetContent委托任意填充下拉按钮内容,只要是SWidget就行。

void SVRLevelEditor::MakeToolBar(FToolBarBuilder& Builder)
{Builder.AddToolBarButton(FMyMenuCommands::Get().SaveFileCommand);Builder.AddComboButton(FUIAction(), FOnGetContent::CreateRaw(this, &FTestMenuModule::GetComboConent), FText::FromString("aaaadd"));}
//创建下拉菜单
TSharedRef SVRLevelEditor::GetComboConent(FMenuBuilder& Builder)
{FMenuBuilder MenuBuilder(true, PluginCommands);MenuBuilder.AddMenuEntry(FTestMenuCommands::Get().TestAction);MenuBuilder.AddMenuEntry(FTestMenuCommands::Get().TestAction);MenuBuilder.AddMenuEntry(FTestMenuCommands::Get().TestAction);MenuBuilder.AddMenuEntry(FTestMenuCommands::Get().TestAction);MenuBuilder.AddMenuEntry(FTestMenuCommands::Get().TestAction);return MenuBuilder.MakeWidget();}

 

 

相关内容

热门资讯

苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...