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

news/2025/3/6 16:25:23/文章来源:https://www.cnblogs.com/chenxuanzuo/p/18639581

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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/877440.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Brainfly: 用 C# 类型系统构建 Brainfuck 编译器

Brainfly: 用 C# 类型系统构建 Brainfuck 编译器Brainfuck 简介 Brainfuck 是由 Urban Mller 在 1993 年创造的一门非常精简的图灵完备的编程语言。 正所谓大道至简,这门编程语言简单到语法只有 8 个字符,每一个字符对应一个指令,用 C 语言来描述的话就是:字符 含义> ++…

01-hytest简介

参考教程:http://vip3.byhy.net/auto/pyatframework/hytest-01/ 安装:pip3 install hytest hytest对应的python版本要求:Python3.6或者更高版本 运行hytest自动化测试:打开命令行窗口 切换到自动化代码根目录 运行hytest,运行hytest其实就是运行python -m hytest.run 如果…

【编码】自定义通信协议——实现零拷贝文件传输

前言 上一篇随笔,介绍了如何扩展自定义协议的请求类型。本篇随笔我将介绍如何基于这个自定义协议来实现文件传输,其中将涉及数据分片和零拷贝 在设计自定义协议之前,我们首先了解一下HTTP协议是如何处理文件传输的。 HTTP协议的实现方式 在这里,我们主要讨论应用最广泛的HT…

研发的护城河到底是什么?

0 你的问题,我知道! 和大厂朋友聊天,他感叹原来努力干活,做靠谱研发,积累职场经验,干下来,职业发展一般问题不大。而如今大厂“年轻化”,靠谱再不能为自己续航,企业似乎也不愿意持续为经验买单。 在这不确定时代,职业发展中有无硬通货? 更长远职业发展角度:要抓住机…

冶炼金属

暴力做法 #include<iostream> #include<vector> using namespace std;void solve() {int n; cin >> n;vector<int>a(n), b(n);for (int i = 0; i < n; i++){cin >> a[i] >> b[i];}for (int i = 1; i < 1e6; i++)//从小到大,找最小值…

昆明理工大学2025年硕士研究生调剂汇总表1月31日更新

这是今年昆明理工大学调剂信息,目前只更新了部分学院的部分专业,后续会持续更新。 【腾讯文档】昆明理工大学2025年硕士研究生调剂汇总表 https://docs.qq.com/sheet/DZERIbnpPb3JjeHFO

子串简写

二分法: 要求:pc2-pc1+1>=k 变形:i(pc2)-k+1>=pc1#include <iostream> #include <string> #include<vector> #define int long long using namespace std; void solve() {int k;cin >> k;char c1, c2;cin >> c1 >> c2;string s;…

傻瓜教程 一步一步把blazor项目发布到linux(debian12,nginx反向代理设置,net8,net9适用)

接触blazor有一段时间了,感觉非常好用,特别适合企业内部开发用。开发效率高,界面优美,重要得是会c#的朋友不用再去学习js等前端技术了,虽然平时也看得懂js,html,css,但要自己写还是需要从头去学习的,不想再浪费精力去学习,毕竟会的再多,杂而不精也没什么意义。而自己…

[Tools] 发布代码

我们已经将我们的代码开源到了 github 上面,但是如果是其他开发者想要使用我们的库,还需要去 github 上面手动下载下来,添加到他们的项目里面,这样是非常低效的一种方式。 npm 的出现解决了这个问题,npm 是前端领域非常出名的一个包的托管平台,提供了代码的托管和检索以及…

威海市,杨文召——老赖!!!

威海市,杨文召——老赖!!!

思科静态路由(包含小实验)

思科静态路由 路由:从源主机到目标主机的转发过程 路由器是根据路由表转发数据 路由表:路由器中维护的路由条目的集合 路由器根据路由表做路径选择 路由表的形成 直连网段 本地接口配置IP地址和子网掩码,端口开启状态,形成直连路由 非直连路由 不是本地接口配置IP地址和子网…

PKUWC2025 D2T1

其实是场上的想到的做法,但是当时被卡 corner case 了 QaQ。 注意到,我们其实可以 \(O(1)\) 次 query 求出 \(x\) 和 \(y\) 的距离。具体地,我们再找三个点,现在有 \(5\) 个点,\(10\) 个距离,而我们又可以 query \(10\) 次,正好可以解出两两距离。这里如果 \(n\le 4\) 特…