在UE5中创建顶级菜单项和子菜单

本文介绍了如何在UnrealEngine4(UE4)中使用MenuHelper类来创建和管理顶级菜单项以及子菜单,展示了如何添加自定义菜单项并将其插入到特定位置,同时提及了模块启动与关闭时的相关操作,以及如何通过蓝图控件创建独立窗口。

实现的效果:

顶级菜单项:

//.h
static const FName base_menu_name("LevelEditor.MainMenu.XXXX");

//.cpp
void MenuHelper::InitMenu()
{		
	UToolMenu* menu = UToolMenus::Get()->FindMenu(base_menu_name);//判断顶级菜单项中是否已经存在
	if (!menu)
	{
		menu = UToolMenus::Get()->ExtendMenu("LevelEditor.MainMenu");
		FToolMenuSection& section = menu->FindOrAddSection(NAME_None);
		FToolMenuEntry& entry = section.AddSubMenu("XXXX",LOCTEXT("XXXXXXXXX", "XXXXXXX"),LOCTEXT("XXXXXXXXXXX", "XXXXXXXXXXXX"),FNewToolMenuChoice());

		entry.InsertPosition = FToolMenuInsert("Help", EToolMenuInsertType::After);//将自定义的菜单项置于"Help"菜单项的后面
		menu = UToolMenus::Get()->RegisterMenu(base_menu_name);
	}
}

子菜单项:

void MenuHelper::AddSheerToolMenuEntry(const FName section_name, const FName menu_name, const TAttribute<FText>& display_name, const TAttribute<FText>& tool_tip, const TAttribute<FSlateIcon>& icon, const FToolUIActionChoice& action)
{
	UToolMenu* menu = UToolMenus::Get()->FindMenu(base_menu_name);//找到顶级菜单项
	if (menu)
	{
		FToolMenuSection* section = menu->FindSection(section_name);//找子菜单项
		if (!section)
		{
			FToolMenuSection& new_section = menu->AddSection(section_name, FText::FromName(section_name));
			new_section.AddMenuEntry(menu_name,display_name,tool_tip,icon,action);
		}
		else
		{
			section->AddMenuEntry(menu_name,display_name,tool_tip,icon,action);
		}
	}
}

在类中调用这两个函数:

//.h
static const FName CPTabName("CP");

//.cpp
void FCPModule::StartupModule()
{
	FCPStyle::Initialize();
	FCPStyle::ReloadTextures();

	MenuHelper::InitMenu();
	MenuHelper::AddMenuEntry(TEXT("AAA"),TEXT("BBB"),LOCTEXT("PluginName","B B B"),LOCTEXT("PluginsDesc","对插件功能的描述"),FSlateIcon(),FToolUIActionChoice(FExecuteAction::CreateRaw(this,&FCPModule::PluginButtonClicked)));

	FGlobalTabmanager::Get()->RegisterNomadTabSpawner(CPTabName, FOnSpawnTab::CreateRaw(this, &FCPModule::OnSpawnPluginTab))
		.SetDisplayName(LOCTEXT("FCTabTitle", "BBB"))
		.SetMenuType(ETabSpawnerMenuType::Hidden);
	FWorldDelegates::OnWorldCleanup.AddRaw(this, &FCPModule::PreWorldCleanup);//添加委托
}

void FCheckProjectModule::ShutdownModule()
{
	UToolMenus::UnRegisterStartupCallback(this);

	UToolMenus::UnregisterOwner(this);

	FCheckProjectStyle::Shutdown();

	FGlobalTabmanager::Get()->UnregisterNomadTabSpawner(CPTabName);
}

TSharedRef<SDockTab> FCheckProjectModule::OnSpawnPluginTab(const FSpawnTabArgs& SpawnTabArgs)
{
	//注册编辑器独立窗口
    //我这里用来打开用蓝图控件做的ui
}

void FCheckProjectModule::PreWorldCleanup(UWorld*, bool, bool)
{
	TSharedPtr<SDockTab> tab = FGlobalTabmanager::Get()->FindExistingLiveTab(CPTabName);
	if (tab) {
		tab.Get()->RequestCloseTab();
	}
}

void FCheckProjectModule::PluginButtonClicked()
{
	
}

#undef LOCTEXT_NAMESPACE
	
IMPLEMENT_MODULE(FCheckProjectModule, CheckProject)

API参考:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值