虚幻5-分享一些Ue4|5的Editor window custom自定义原始必须系统学习的代码

目录

打开一个界面的时候,可以关闭一些界面

创建自定义Editor Window

Window - SWindow 的关闭

某Develop官方插件的pushWindow 代码c++

最后,不用SWindow->Closed,也可以

参考-扩展阅读:


记录一些c++ 虚幻引擎的代码

、估计没有UE经验的看不明白

但有经验的又不需要看

所以这个分享,有些无谓

打开一个界面的时候,可以关闭一些界面

如这个链接可以知道:

UE4 自定义DockTab(四) - 知乎 (zhihu.com)

/// <summary>
/// Step---2、打开DockTab的函数逻辑
/// </summary>
void FBPEditorMenuModule::OnOpenCustomDockTab()
{
	if (ActiveTab.IsValid())
	{
		if (ActiveTab->CanCloseTab())
		{
			ActiveTab->RequestCloseTab();
			ActiveTab = nullptr;
		}
	}
	if (FBPEditorMenuModule::GatherWBPInfo())
	{
		FGlobalTabmanager::Get()->InvokeTab(DockTabNameId);
	}
}

创建自定义Editor Window

《不说了,官方文档有》

就是没说如何监听关闭

Window - SWindow 的关闭

如何找到下面代码?明显在于查找字串

“window xxx being destroyed"

而这个事件,才是重点

WindowClosedEvent.Broadcast( SharedThis( this ) );

/** Calls OnWindowClosed delegate and WindowClosedEvent when this window is about to be closed */
void SWindow::NotifyWindowBeingDestroyed()
{
	OnWindowClosed.ExecuteIfBound( SharedThis( this ) );
	WindowClosedEvent.Broadcast( SharedThis( this ) );

#if WITH_EDITOR
	if(bIsModalWindow)
	{
		FCoreDelegates::PostSlateModal.Broadcast();
	}
#endif

	// Logging to track down window shutdown issues
	if (IsRegularWindow())
	{
		UE_LOG(LogSlate, Log, TEXT("Window '%s' being destroyed"), *GetTitle().ToString());
	}
}

某Develop官方插件的pushWindow 代码c++

void UE::MultiUserServer::FModalWindowManager::PushWindow(const TSharedRef<SWindow>& Window)
{
	if (ensureMsgf(bRootWindowIsValid, TEXT("Root window has already been destroyed!")))
	{
		check(!WindowStack.Contains(Window));
		WindowStack.Push(Window);
	
		Window->GetOnWindowClosedEvent().AddLambda([this](const TSharedRef<SWindow>& Window)
		{
			// Might request window destruction twice
			if (WindowStack.Contains(Window))
			{
				PopWindow();
			}
		});
	}
}

最后,不用SWindow->Closed,也可以

据网上说SWindow,继承自SComponentWidget

Slate 是否又是基类

在如此多搞不清楚,理不顺,我也管不了的情况下,

我找到一个 TabClosed 的方法,能实现所需效果

(c++的面向对象还是很烦的,各种宏更是恶心。。。。。。再次印证了四字成语。。。。。。。。。。。。过犹不及。。。)

TSharedRef<SDockTab> FSearchUIWindowModule::OnSpawnPluginTab(const FSpawnTabArgs& SpawnTabArgs)
{

	/*FText WidgetText = FText::Format(
		LOCTEXT("WindowWidgetText", "Add code to {0} in {1} to override this window's contents"),
		FText::FromString(TEXT("FSearchUIWindowModule::OnSpawnPluginTab")),
		FText::FromString(TEXT("SearchUIWindow.cpp"))
		);*/

	return SNew(SDockTab)
		.TabRole(ETabRole::NomadTab)
		[
			
			// Put your tab content here!
		/*	SNew(SBox)
			.HAlign(HAlign_Center)
			.VAlign(VAlign_Center)
			[
				SNew(STextBlock)
				.Text(WidgetText)
			]*/
			SNew(SSQuickStartWindowMenu)
		]
		.OnTabClosed(SDockTab::FOnTabClosedCallback::CreateLambda([this](TSharedRef<SDockTab> Self) {
			//this->OnWindowClose(Self);
			UE_LOG(LogTemp, Error, TEXT("11-OnWindowClose"));
			}));

}

参考-扩展阅读:

UE4/UE5 Windows窗口变化监听随笔_ue4 ugameviewportclient_WhiteTian的博客-CSDN博客

UE4 Slate的语法初步分析_追风ぁPanda的博客-CSDN博客 

(从这些链接的作者再次印证了之前说过的:还在研究c++的都是10+年以上码龄的老油条) 

猜你喜欢

转载自blog.csdn.net/avi9111/article/details/131346314