实现的效果:
顶级菜单项:
//.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参考: