1. 基本概念
1.1. Slate是虚幻UI框架设计的底层,该框架中最基本的类是SWidget
1.1.1.显然,我们容易注意到,直属于该框架的类拥有着指定的命名规则,即以S开头
1.2. UMG, UWidget, Slate关联
1.2.1. UMG:Unreal Motion Graphics UI Designer 虚幻的图形界面设计工具
1.2.2. 单纯Slate生命周期由TSharePtr控制。UE用UObject对Slate控件包裹得到UWidget。UWidget反射暴露了Slate的部分信息,这样一来,虽然生命周期控制更加复杂,但为便携的UMG工具流提供了支持。
1.2.3. UWidget, SObjectWidget, SWidget
1.2.3.1. 层级关系
UWidget持有SObjectWidget,SObjectWidget持有SWidget,SObjectWidget继承自FGCObject,它会添加对UWidget的引用,负责确保UWidget的正确GC
1.2.3.2. 销毁步骤
[控件开始销毁,SObjectWidget引用计数归零] -> [UWidget引用计数归零,在下一次GC中销毁] -> [UWidget释放控件的TSharePtr,控件完成销毁]
1.2.3.3. 销毁顺序
SObjectWidget->UWidget->控件
2. 关键类结构
2.1. SWidget
-> SLeafWidget [ 0子控件 ]
-> SCompoundWidget [ 1子控件 ]
-> SWindow
-> SPanel [ ≥1子控件 ]
-> SBoxPanel
-> SVerticalBox
-> SHorizontalBox
2.2. FSlateApplication
3. 实践代码
3.1. 构造宏,不是函数,其原因是为了用宏便携地批量实现各种类的操作符重载
3.1.1. SNew(WidgetType, ...):通用的构造方式
3.1.2. SAssignNew(ExposeAs, WidgetType, ...):提供参数 ExposeAs,新建控件将赋值给该参数
3.1.3. SArgumentNew(InArgs, WidgetType, ...):提供参数 InArgs,使用参数集进行构造
3.2. 神奇的操作符重载
3.2.1. .
这玩意甚至可以“连着”使用,直观上和正常的类成员访问符差不多,都是访问属性和函数,但是却神奇且高明地允许连着使用
3.2.2. +
SPanel 的子类,可以使用 +SPanel::Slot 添加插槽,然后再在插槽里填充子控件
3.2.2. []
SCompoundWidget 和 SPanel::Slot ,可以使用operator []来填充子控件
3.3. 实际代码
3.3.1. 添加一个窗口并显示
3.3.2. 一个可以拖进窗口的tab
3.3.3. 效果展示