【虚幻引擎】UE4 Slate菜单栏(menubar)工具栏(ToolBar)命令集合(TCommands)

一、认识菜单栏(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<FMyCommands>
{
public:
	FMyCommands() :
		TCommands<FMyCommands>(TEXT("MyMenu"), NSLOCTEXT("Contexts", "MyMenu", "MyMenu Test"), NAME_None, FMyCommands::GetStyleSetName())
	{
	}

	virtual void RegisterCommands() override;

public:
	TSharedPtr<FUICommandInfo> OpenFileCommand;
	TSharedPtr<FUICommandInfo> CloseFileCommand;
	TSharedPtr<FUICommandInfo> SaveFileCommand;

};
TSharedPtr<FUICommandList> 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.

  扩展菜单栏的方法:

   一、加载模块

扫描二维码关注公众号,回复: 14581140 查看本文章
//编辑器的模块加载
FLevelEditorModule& LevelEditorModule = FModuleManager::LoadModuleChecked<FLevelEditorModule>("LevelEditor");
//动画蓝图的模块加载
IAnimationBlueprintEditorModule& AnimationBlueprintEditorModule = FModuleManager::LoadModuleChecked<IAnimationBlueprintEditorModule>("AnimationBlueprintEditor");

   二、创建Extender对象

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

LevelEditorModule.GetMenuExtensibilityManager()->AddExtender(MenuBarExtend);
//编辑器扩展ToolBar
TSharedPtr<FExtender> 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<SWidget> 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<SWidget> 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();

}

猜你喜欢

转载自blog.csdn.net/qq_43021038/article/details/129492478