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

相关推荐
悟空码字5 小时前
单点登录:一次登录,全网通行
java·后端
傻啦嘿哟5 小时前
物流爬虫实战:某丰快递信息实时追踪技术全解析
java·开发语言·数据库
倚肆5 小时前
Spring Boot Security 全面详解与实战指南
java·spring boot·后端
码力码力我爱你5 小时前
Harmony OS C++实战
开发语言·c++
茄子凉心5 小时前
android 开机启动App
android·java·开发语言
8***f3955 小时前
工作中常用springboot启动后执行的方法
java·spring boot·后端
低客的黑调5 小时前
了解JVM 结构和运行机制,从小白编程Java 大佬
java·linux·开发语言
想唱rap5 小时前
C++ map和set
linux·运维·服务器·开发语言·c++·算法
FuckPatience5 小时前
C# 实现元素索引由1开始的链表
开发语言·链表·c#
f***R85 小时前
解决bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException
java·数据库·sql