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 中无父对象的控件是「游离控件」,永远不会在界面上绘制。
✅ 执行细节
-
函数内部会根据
.ui文件的描述,自动new出所有你拖入的控件(按钮、TableWidget、自定义 Event 控件等); -
强制将这些子控件的父对象设置为
setupUi(this)的入参this(即当前窗口 / 自定义控件); -
形成「父控件 → 子控件」的树形结构,Qt 的父子对象机制会自动管理子控件的内存、显示、销毁。
工作 2:挂载控件到布局 + 完成布局初始化(对应铁律✅「有布局挂载」)
这是控件能在指定位置正常显示 的核心,Qt 中控件未加入布局,即使有父对象,也会被挤压至 0 像素 / 显示在左上角。
✅ 执行细节
-
函数会根据你在设计师中设置的布局(QVBoxLayout/QHBoxLayout/QGridLayout),自动将所有子控件添加到对应布局中;
-
初始化布局的拉伸策略、间距、对齐方式、边距等属性;
-
触发布局的「尺寸计算」,让子控件根据布局规则,自动分配显示空间。
工作 3:初始化控件 + 绑定内部 UI 指针(对应铁律✅「完成初始化」)
这是自定义控件内部子控件可用 的唯一途径,也是你Event类中ui->tableWidget能被调用的前提。
✅ 执行细节
-
初始化
ui指针 :为当前类的Ui::XXX *ui成员指针分配内存,让ui成为「设计师控件」的唯一操作入口; -
初始化控件基础属性 :将你在设计师中设置的控件属性(尺寸、文本、字体、隐藏 / 显示、表格行列数等),同步到 C++ 代码的控件对象中;
-
绑定自定义控件 :若你在设计师中把
Widget提升为Event类,setupUi会自动将该控件的类型转为Event*,并完成内部ui指针的绑定。