UE4.27, 模块实践, Slate的UI开发 (一)

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. 效果展示

 

posted @ 2025-01-31 23:24  在找饭吃的陈  阅读(211)  评论(0)    收藏  举报