创建UE的TabManager

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()));
}

  • 11
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

A+耶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值