UE5 slate BlankProgram独立程序系列

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

ASlateLearning.Target.cs

cpp 复制代码
// 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

cpp 复制代码
// 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

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

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

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))
		[
			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的引用,此时的代码应该是这样了

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

	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之类的方法

相关推荐
future141242 分钟前
C#学习日记
开发语言·学习·c#
guojl1 小时前
Java多任务编排技术
java
丶意冷1 小时前
mybatisPlus分页方言设置错误问题 mybatisPlus对于Oceanbase的Oracle租户分页识别错误
java·数据库·oracle·oceanbase
king_harry1 小时前
Java程序-OceanBase Connector/J 示例
开发语言
要开心吖ZSH1 小时前
《Spring 中上下文传递的那些事儿》Part 4:分布式链路追踪 —— Sleuth + Zipkin 实践
java·分布式·spring
桦说编程2 小时前
深入解析CompletableFuture源码实现
java·性能优化·源码
傻啦嘿哟2 小时前
Python 办公实战:用 python-docx 自动生成 Word 文档
开发语言·c#
翻滚吧键盘2 小时前
js代码09
开发语言·javascript·ecmascript
q567315232 小时前
R语言初学者爬虫简单模板
开发语言·爬虫·r语言·iphone
蓝澈11212 小时前
迪杰斯特拉算法之解决单源最短路径问题
java·数据结构