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

文章介绍了在研究UE4源码时如何利用FTabManager类创建自定义窗口并设置布局方式。通过RegisterTabSpawner注册窗口,使用NewLayout创建布局,并通过Slate和UMG构建不同类型的界面内容。示例展示了如何创建并布局三个不同窗口:PackageCenter、HomeCenter和LeverEditor。
摘要由CSDN通过智能技术生成

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

结果如下

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

飞起的猪

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

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

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

打赏作者

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

抵扣说明:

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

余额充值