B站教学链接:https://space.bilibili.com/449549424?spm_id_from=333.1007.0.0
前言:最近在研究UE4源码的时候,想实现自定义窗口,设置自己的布局方式,就看到了FTabmanager这个类,能够创建不同的布局方式。
我们先看源码的实现方式:FTabmanager类实现了创建窗口的不同方法
NewLayout:创建新的布局方式
RegisterTabSpawner:注册在模块启动时的函数,这个就是创建了一个窗口,窗口所放置的内容
RestoreFrom:从窗口中显示
测试案例:
调用独立窗口需要在模块启动的时候调用FGlobalTabmanager::Get()的RegisterTabSpawner函数类创建回调函数
然后就是slate调用SNew(SDockTab)然后定制自己的具体界面,可以是slate,可以是object类,也可以是UMG类,UMG类需要通过TakeWidget()转成SWidget类才能使用,因为TakeWidget函数实现了一个方法:
实现三个窗口的创建
FGlobalTabmanager::Get()->RegisterTabSpawner("PackageCenter", FOnSpawnTab::CreateUObject(this, &AMyActor::SpawnCustomTab, FName("PackageCenter")));
FGlobalTabmanager::Get()->RegisterTabSpawner("HomeCenter", FOnSpawnTab::CreateUObject(this, &AMyActor::SpawnCustomTab, FName("HomeCenter")));
FGlobalTabmanager::Get()->RegisterTabSpawner("LeverEditor", FOnSpawnTab::CreateUObject(this, &AMyActor::SpawnCustomTab, FName("LeverEditor")));
TSharedRef<FTabManager::FLayout> Layout = FTabManager::NewLayout(TEXT("Layout"))
->AddArea(
FTabManager::NewArea(1920,1080)
->SetOrientation(EOrientation::Orient_Horizontal)
->Split(
FTabManager::NewStack()
->AddTab("PackageCenter", ETabState::OpenedTab)
->AddTab("HomeCenter", ETabState::OpenedTab)
->AddTab("LeverEditor", ETabState::OpenedTab)
->AddTab("HelpCenter", ETabState::ClosedTab)
)
);
TSharedPtr<SWidget> MainFrameContent = FGlobalTabmanager::Get()->RestoreFrom(Layout, TSharedPtr<SWindow>());
回调函数
TSharedRef<SDockTab> AMyActor::SpawnCustomTab(const FSpawnTabArgs& Arg, FName TabIdentifier)
{
if (TabIdentifier == TEXT("PackageCenter"))
{
return SNew(SDockTab);
}
else if (TabIdentifier == TEXT("HomeCenter"))
{
HomeBrowser = CreateWidget<UHomeBrowser>(GetWorld(), MyHomeBrowser_instance);
SAssignNew(HomeCenterTab, SDockTab)
.OnCanCloseTab(SDockTab::FCanCloseTab::CreateUObject(this, &AMyActor::OnCanTabClose))
[
HomeBrowser->TakeWidget()
];
return HomeCenterTab.ToSharedRef();
}
else if (TabIdentifier == TEXT("LeverEditor"))
{
SAssignNew(LevelEditorTab, SDockTab)
.OnCanCloseTab(SDockTab::FCanCloseTab::CreateUObject(this, &AMyActor::OnCanTabClose))
.ContentPadding(FMargin(0));
LevelEditorTab->SetContent(SAssignNew(LeverEditorWidget, SVRLevelEditor));
LeverEditorWidget->Initialize(LevelEditorTab.ToSharedRef());
return LevelEditorTab.ToSharedRef();
}
else if (TabIdentifier == TEXT("HelpCenter"))
{
return SNew(SDockTab);
}
return SNew(SDockTab);
}
结果如下
文章来源:https://www.toymoban.com/news/detail-691786.html
文章来源地址https://www.toymoban.com/news/detail-691786.html
到了这里,关于【虚幻引擎】UE4 FTabmanager实现多窗口的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!