Qt 控件使用铁律

1. Qt 自定义控件「UI 提升」的铁律

✅ UI 设计师拖入Widget → 提升为Event类 → Qt 自动生成ui->tw_info_1,这是绑定到界面的有效对象绝对不要用 new 覆盖

✅ 该对象的ui->tableWidget已由setupUi初始化,可直接调用配置函数。

2. Qt 控件使用铁律(控件显示的 3 个必要条件)

有父对象new 类名(this) 或 设计师拖拽,否则是游离对象;

有布局挂载 :控件必须加入QVBoxLayout/QHBoxLayout,否则无法绘制;

完成初始化 :自定义控件必须执行ui->setupUi(this),否则内部子控件无效。

3. 指针赋值的核心原则

先赋值有效指针,后调用函数

设计师的ui->xxx是黄金指针:无需 new、已初始化、已挂载,直接复用即可;

绝对不要用空对象 (new 的游离对象) 覆盖UI 里的有效对象tab_info[i] = ui->xxx 后,不要再执行tab_info[i] = new xxx()


ui->setupUi(this) 是什么 & 核心作用

✅ 本质定义

ui->setupUi(this)Qt UIC 工具 将你在「Qt 设计师」中绘制的.ui界面文件,自动生成的初始化函数 ,是Qt 可视化界面与 C++ 代码之间的桥梁核心,无此函数,设计师里拖的所有控件(按钮、表格、自定义控件)全部无效。

✅ 核心一句话作用

为当前窗口 / 自定义控件(this指向的对象)创建、实例化、绑定 所有在 Qt 设计师中拖入的子控件,并完成控件的父子关系绑定、布局挂载、基础属性初始化三大核心工作。

工作 1:实例化所有子控件 + 绑定父子关系(对应铁律✅「有父对象」)

这是控件能显示的第一前提 ,Qt 中无父对象的控件是「游离控件」,永远不会在界面上绘制

✅ 执行细节

  1. 函数内部会根据.ui文件的描述,自动new出所有你拖入的控件(按钮、TableWidget、自定义 Event 控件等);

  2. 强制将这些子控件的父对象设置为setupUi(this)的入参this(即当前窗口 / 自定义控件);

  3. 形成「父控件 → 子控件」的树形结构,Qt 的父子对象机制会自动管理子控件的内存、显示、销毁。

工作 2:挂载控件到布局 + 完成布局初始化(对应铁律✅「有布局挂载」)

这是控件能在指定位置正常显示 的核心,Qt 中控件未加入布局,即使有父对象,也会被挤压至 0 像素 / 显示在左上角

✅ 执行细节

  1. 函数会根据你在设计师中设置的布局(QVBoxLayout/QHBoxLayout/QGridLayout),自动将所有子控件添加到对应布局中

  2. 初始化布局的拉伸策略、间距、对齐方式、边距等属性;

  3. 触发布局的「尺寸计算」,让子控件根据布局规则,自动分配显示空间。

工作 3:初始化控件 + 绑定内部 UI 指针(对应铁律✅「完成初始化」)

这是自定义控件内部子控件可用 的唯一途径,也是你Event类中ui->tableWidget能被调用的前提。

✅ 执行细节

  1. 初始化ui指针 :为当前类的Ui::XXX *ui成员指针分配内存,让ui成为「设计师控件」的唯一操作入口;

  2. 初始化控件基础属性 :将你在设计师中设置的控件属性(尺寸、文本、字体、隐藏 / 显示、表格行列数等),同步到 C++ 代码的控件对象中

  3. 绑定自定义控件 :若你在设计师中把Widget提升为Event类,setupUi会自动将该控件的类型转为Event*,并完成内部ui指针的绑定。

相关推荐
Scott9999HH3 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
码智社4 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海4 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖5 小时前
JDK 26 新特性详解
java·开发语言
马优晨6 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
人邮异步社区8 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大8 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai8 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
এ慕ོ冬℘゜9 小时前
前端基础:什么是时间戳?JS获取时间戳三种方法与实战用途
开发语言·前端·javascript
执明wa9 小时前
LayoutInflater详解: XML是如何变成View的?
android·xml·开发语言·android studio