【虚幻引擎】UE4 FTabmanager实现多窗口

前言:最近在研究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);
}

结果如下

 

猜你喜欢

转载自blog.csdn.net/qq_43021038/article/details/129436780