UE5 slate BlankProgram独立程序系列

发布于:2024-11-27 ⋅ 阅读:(68) ⋅ 点赞:(0)

源码版Engine\Source\Programs\中copy BlankProgram文件夹,重命名为ASlateLearning,修改所有文件命名及内部名称。

ASlateLearning.Target.cs

// Copyright Epic Games, Inc. All Rights Reserved.

using UnrealBuildTool;
using System.Collections.Generic;

[SupportedPlatforms(UnrealPlatformClass.All)]
public class ASlateLearningTarget : TargetRules
{
	public ASlateLearningTarget(TargetInfo Target) : base(Target)
	{
		Type = TargetType.Program;
		IncludeOrderVersion = EngineIncludeOrderVersion.Latest;
		LinkType = TargetLinkType.Monolithic;
		LaunchModuleName = "ASlateLearning";
	
		bBuildDeveloperTools = false;
		
		bool bDebugOrDevelopment = Target.Configuration == UnrealTargetConfiguration.Debug || Target.Configuration == UnrealTargetConfiguration.Development;
		//bBuildWithEditorOnlyData = Target.Platform.IsInGroup(UnrealPlatformGroup.Desktop) && bDebugOrDevelopment;
	
		bBuildWithEditorOnlyData = true;
		bCompileAgainstEngine = false;
		bCompileAgainstCoreUObject = true;
		bCompileAgainstApplicationCore = true;
		bCompileICU = false;
		
		bIsBuildingConsoleApplication = true;
	}
}

ASlateLearning.Build.cs

// Copyright Epic Games, Inc. All Rights Reserved.

using UnrealBuildTool;

public class ASlateLearning : ModuleRules
{
	public ASlateLearning(ReadOnlyTargetRules Target) : base(Target)
	{
		PublicIncludePaths.Add("Runtime/Launch/Public");
		PrivateIncludePaths.Add("Runtime/Launch/Private");

		PrivateDependencyModuleNames.AddRange(
			new string[]
			{
				"AppFramework",
				"Core",
				"ApplicationCore",
				"Projects",
				"Slate",
				"SlateCore",
				"StandaloneRenderer",
			});
	}
}

 ASlateLearning.cpp

// Copyright Epic Games, Inc. All Rights Reserved.

#include "ASlateLearning.h"

#include "RequiredProgramMainCPPInclude.h"
#include "StandaloneRenderer.h"

DEFINE_LOG_CATEGORY_STATIC(LogASlateLearning, Log, All);

IMPLEMENT_APPLICATION(LogASlateLearning, "ASlateLearning");

INT32_MAIN_INT32_ARGC_TCHAR_ARGV()
{
	GEngineLoop.PreInit(ArgC, ArgV);

	FSlateApplication::InitializeAsStandaloneApplication(GetStandardStandaloneRenderer());
	FSlateApplication::InitHighDPI(true);

	const TSharedPtr<SWindow> MainWindow = SNew(SWindow).ClientSize(FVector2D(800, 600));

	FSlateApplication::Get().AddWindow(MainWindow.ToSharedRef());

	while (!IsEngineExitRequested())
	{
		BeginExitIfRequested();
		FSlateApplication::Get().PumpMessages();
		FSlateApplication::Get().Tick();
	}

	FEngineLoop::AppExit();

	return 0;
}

运行后会出现创建的窗口,后面继续扩展

// Copyright Epic Games, Inc. All Rights Reserved.

#include "ASlateLearning.h"

#include "RequiredProgramMainCPPInclude.h"
#include "StandaloneRenderer.h"

DEFINE_LOG_CATEGORY_STATIC(LogASlateLearning, Log, All);

IMPLEMENT_APPLICATION(LogASlateLearning, "ASlateLearning");

INT32_MAIN_INT32_ARGC_TCHAR_ARGV()
{
	GEngineLoop.PreInit(ArgC, ArgV);

	FSlateApplication::InitializeAsStandaloneApplication(GetStandardStandaloneRenderer());
	FSlateApplication::InitHighDPI(true);

	const TSharedPtr<SWindow> MainWindow = SNew(SWindow).ClientSize(FVector2D(800, 600))
		[
			SNew(SHorizontalBox) + SHorizontalBox::Slot()
			[
				SNew(SButton).Text(NSLOCTEXT("L10N", "Key", "Button Content"))
			]
		];

	FSlateApplication::Get().AddWindow(MainWindow.ToSharedRef());
	

	while (!IsEngineExitRequested())
	{
		BeginExitIfRequested();
		FSlateApplication::Get().PumpMessages();
		FSlateApplication::Get().Tick();
	}

	FEngineLoop::AppExit();

	return 0;
}

运行后窗口样式,button太大因为Slot默认的对其策略是HAlign::Fill,VAlign::Fill,调整后的这部分代码应该是

 使用SOverlay::FOverlaySlot* Slot;个Slot的指针,用.Expose(Slot)获取指针,Expose方法填入一个插槽指针并将其返回,此后,我们通过APi可以获得一个SWidget的引用,此时的代码应该是这样了

// Copyright Epic Games, Inc. All Rights Reserved.

#include "ASlateLearning.h"

#include "RequiredProgramMainCPPInclude.h"
#include "StandaloneRenderer.h"

DEFINE_LOG_CATEGORY_STATIC(LogASlateLearning, Log, All);

IMPLEMENT_APPLICATION(LogASlateLearning, "ASlateLearning");

INT32_MAIN_INT32_ARGC_TCHAR_ARGV()
{
	GEngineLoop.PreInit(ArgC, ArgV);

	FSlateApplication::InitializeAsStandaloneApplication(GetStandardStandaloneRenderer());
	FSlateApplication::InitHighDPI(true);

	SOverlay::FOverlaySlot* Slot;

	const TSharedPtr<SWindow> MainWindow = SNew(SWindow).ClientSize(FVector2D(800, 600))
		[
			SNew(SOverlay)
			+ SOverlay::Slot().HAlign(HAlign_Left).VAlign(VAlign_Top).Expose(Slot)
			[
				SNew(SHorizontalBox)
				+ SHorizontalBox::Slot().HAlign(HAlign_Left).VAlign(VAlign_Top)
				[
					SNew(SButton).Text(NSLOCTEXT("L10N", "Key", "Button Content"))
				]
			]
		];

	SWidget& slotwidget = Slot->GetWidget().Get();
	SHorizontalBox& HorizontalBox = static_cast<SHorizontalBox&>(slotwidget);

	for (int i = 0; i <5;++i)
	{
		HorizontalBox.AddSlot()
		[
			SNew(SHorizontalBox)
				+ SHorizontalBox::Slot().HAlign(HAlign_Left).VAlign(VAlign_Top)
				[
					SNew(SButton).Text(NSLOCTEXT("L10N", "Key", "Button Content"))
				]
		];
	}
	
	FSlateApplication::Get().AddWindow(MainWindow.ToSharedRef());


	while (!IsEngineExitRequested())
	{
		BeginExitIfRequested();
		FSlateApplication::Get().PumpMessages();
		FSlateApplication::Get().Tick();
	}

	FEngineLoop::AppExit();

	return 0;
}

 运行后的窗口变成了

 可以为每个Button添加一些方法,通过OnClicked_Lambda之类的方法

在窗口中创建一个Tab页的方法

INT32_MAIN_INT32_ARGC_TCHAR_ARGV()
{
	GEngineLoop.PreInit(ArgC, ArgV);

	FSlateApplication::InitializeAsStandaloneApplication(GetStandardStandaloneRenderer());
	FSlateApplication::InitHighDPI(true);

	// 新建 SWindow 控件
	TSharedRef<SWindow> MainWindow = SNew(SWindow)
	.AutoCenter( EAutoCenter::PreferredWorkArea )
	.CreateTitleBar( false ) //关闭窗口标题框以防止生成双重标题框,因为 SDockingArea 自带标题框
	.ClientSize(FVector2D(800,600))
	.Title(FText::FromString("My Window"));

	// 动态注册Tab页面的生成器
	FGlobalTabmanager::Get()->RegisterTabSpawner(FName("CustomTab"),FOnSpawnTab::CreateLambda([](const FSpawnTabArgs& Args){
		return SNew(SDockTab)
			[
				SNew(SSpacer)
			];
	}));
	//动态注册时激活
	FGlobalTabmanager::Get()->TryInvokeTab(FTabId("CustomTab"));
		
		while (!IsEngineExitRequested())
		{
			BeginExitIfRequested();
			FSlateApplication::Get().PumpMessages();
			FSlateApplication::Get().Tick();
		}
	
		FEngineLoop::AppExit();

	return 0;
}

 运行后是这样的

我要在这个窗口中多创建几个Tab页该怎么办???


网站公告

今日签到

点亮在社区的每一天
去签到