1.创建一个FTabManager:
TSharedPtr<SDockTab> DockTab=SNew(SDockTab);
TSharedPtr<FTabManager> TabManager=FGlobalTabmanager::Get()->NewTabManager(DockTab.ToSharedRef());
2.创建一个布局Flayout
const TSharedRef<FTabManager::FLayout> Layout=FTabManager::NewLayout(TEXT("TestLayout")); Layout->AddArea();
3.创建一个主区域
FTabManager::NewPrimaryArea()
4.创建一个FStack
FTabManager::NewStack()
FStack 单独从 FLayoutNode 继承,可以理解成一个标签页集合(下图红框的效果,一个区域又两个tab),在这里面保存了一系列子页面。ForegroundTabId 控制了在这些标签页中哪一个是可见的。
FStack 是一个容器,它里面可以装下很多 FTab。FTab 代表一个子页面,可以包含任意的 SWidget 控件。它有一个唯一的标识符(TabId),以及一些其他属性
5.创建一个Splitter
FTabManager::NewSplitter()
FArea 继承自 FSplitter,FSplitter 和 FArea 大致相同,可以互相嵌套,区别在于其最终生成的 SWidget 类型不同。FSplitter 继承自 FLayoutNode,在 FSplitter 之间的空间可以通过空间之间的辐条拖拽来改变。
6.一套完整流程
void CreateToolBarButton();
TSharedPtr<SWindow> Window;
TSharedPtr<SDockTab> DockTab;
TSharedPtr<SWidget> MainTab;
TSharedPtr<FTabManager> TabManager;
static const FName TabName("MyTabName");
static const FName TabName2("MyTabName2");
static const FName TabName3("MyTabName3");
static const FName TabName4("MyTabName4");
static const FName TabName5("MyTabName5");
void FSlateTest3Module::CreateToolBarButton()
{
DockTab=SNew(SDockTab);
TabManager=FGlobalTabmanager::Get()->NewTabManager(DockTab.ToSharedRef());
const TSharedRef<FTabManager::FLayout> Layout=FTabManager::NewLayout(TEXT("TestLayout"));
Layout->AddArea(
FTabManager::NewPrimaryArea()
->SetOrientation(Orient_Horizontal)
->Split(
FTabManager::NewStack()
->SetHideTabWell(true)
->AddTab(TabName,ETabState::OpenedTab)
)
->Split(
FTabManager::NewStack()
->SetHideTabWell(true)
->AddTab(TabName2,ETabState::ClosedTab)
)
->Split
(
FTabManager::NewSplitter()
->SetOrientation(Orient_Vertical)
->Split
(
FTabManager::NewStack()
->SetHideTabWell(true)
->AddTab(TabName3,ETabState::OpenedTab)
)
->Split
(
FTabManager::NewStack()
->SetHideTabWell(true)
->AddTab(TabName4,ETabState::OpenedTab)
->AddTab(TabName5,ETabState::OpenedTab)
)
)
);
//注册并生成一个Tab
TabManager->RegisterTabSpawner(TabName, FOnSpawnTab::CreateLambda([&](const FSpawnTabArgs& Args)
{
return
SNew(SDockTab)
.TabRole(ETabRole::NomadTab)
[
SNew(STextBlock)
.Text(FText::FromName(TabName))
];
}));
//注册并生成一个Tab
TabManager->RegisterTabSpawner(TabName2, FOnSpawnTab::CreateLambda([&](const FSpawnTabArgs& Args)
{
return
SNew(SDockTab)
.TabRole(ETabRole::NomadTab)
[
SNew(STextBlock)
.Text(FText::FromName(TabName2))
];
}));
//注册并生成一个Tab
TabManager->RegisterTabSpawner(TabName3, FOnSpawnTab::CreateLambda([&](const FSpawnTabArgs& Args)
{
return
SNew(SDockTab)
.TabRole(ETabRole::NomadTab)
[
SNew(STextBlock)
.Text(FText::FromName(TabName3))
];
}));
//注册并生成一个Tab
TabManager->RegisterTabSpawner(TabName4, FOnSpawnTab::CreateLambda([&](const FSpawnTabArgs& Args)
{
return
SNew(SDockTab)
.TabRole(ETabRole::NomadTab)
[
SNew(STextBlock)
.Text(FText::FromName(TabName4))
];
}));
//注册并生成一个Tab
TabManager->RegisterTabSpawner(TabName5, FOnSpawnTab::CreateLambda([&](const FSpawnTabArgs& Args)
{
return
SNew(SDockTab)
.TabRole(ETabRole::NomadTab)
[
SNew(STextBlock)
.Text(FText::FromName(TabName5))
];
}));
Window=SNew(SWindow)
.AutoCenter(EAutoCenter::PreferredWorkArea)
.ClientSize(FVector2D(800,600))
.Title(FText::FromString("My Window"));
//生成Tab
MainTab=TabManager->RestoreFrom(Layout,Window);
//在工具栏中创建了按钮
UToolMenu* ToolMenu=UToolMenus::Get()->ExtendMenu("LevelEditor.LevelEditorToolBar.User");
FToolMenuSection& ToolMenuSection=ToolMenu->FindOrAddSection(NAME_None);
ToolMenuSection.AddEntry(FToolMenuEntry::InitToolBarButton("Button",FToolUIActionChoice(FExecuteAction::CreateLambda([&]()
{
GEngine->AddOnScreenDebugMessage(-1,2,FColor::Blue,"Open Window");
FSlateApplication::Get().AddWindow(Window.ToSharedRef())->SetContent(MainTab.ToSharedRef());
}))
,FText::FromString("Button"),FText::FromString("This is a Button"),FSlateIcon()));
ToolMenuSection.AddEntry(FToolMenuEntry::InitToolBarButton("Button1",FToolUIActionChoice(FExecuteAction::CreateLambda([&]()
{
TabManager->TryInvokeTab(TabName2);
}))
,FText::FromString("Button1"),FText::FromString("This is a Button1"),FSlateIcon()));
}