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

相关推荐
安卓开发者1 分钟前
鸿蒙NEXT应用接入快捷栏:一键直达,提升用户体验
java·harmonyos·ux
APItesterCris3 分钟前
TypeScript 与淘宝 API:构建类型安全的商品数据查询前端 / Node.js 服务
开发语言·php
ftpeak6 分钟前
《Cargo 参考手册》第二十一章:Cargo 包命令
开发语言·rust
yudiandian20149 分钟前
03 Eclipse 配置 JDK 环境
java·ide·eclipse
_码力全开_9 分钟前
P1005 [NOIP 2007 提高组] 矩阵取数游戏
java·c语言·c++·python·算法·矩阵·go
陈一Tender13 分钟前
JavaWeb后端实战(登录认证 & 令牌技术 & 拦截器 & 过滤器)
java·开发语言·spring boot·mysql
Camel卡蒙13 分钟前
红黑树详细介绍(五大规则、保持平衡操作、Java实现)
java·开发语言·算法
jerryinwuhan17 分钟前
机器人模拟器(python)
开发语言·python·机器人
孤廖39 分钟前
吃透 C++ 栈和队列:stack/queue/priority_queue 用法 + 模拟 + STL 标准实现对比
java·开发语言·数据结构·c++·人工智能·深度学习·算法
我命由我1234542 分钟前
Android 对话框 - 对话框全屏显示(设置 Window 属性、使用自定义样式、继承 DialogFragment 实现、继承 Dialog 实现)
android·java·java-ee·android studio·android jetpack·android-studio·android runtime