2026/1/15 14:04:29
网站建设
项目流程
云南网站建设公司前十名,物理服务器,苏州妙笔网络科技有限公司,自己做的网站怎么打开在前两篇博客中#xff0c;我们讲了 Qt HelloWorld 的两种实现方式#xff0c;并顺便提到了 控件的生命周期 和 为什么没有 delete 也不会内存泄漏。
这一篇我们专门聊聊 Qt 的核心机制之一#xff1a;对象树#xff08;Object Tree#xff09;。一、对象树是什么
对象树本…在前两篇博客中我们讲了 Qt HelloWorld 的两种实现方式并顺便提到了控件的生命周期和为什么没有 delete 也不会内存泄漏。这一篇我们专门聊聊 Qt 的核心机制之一对象树Object Tree。一、对象树是什么对象树本质上是一棵多叉树N 叉树用来组织控件和其他 QObject 派生对象。每个控件QObject/QWidget可以有子对象父对象会管理子对象的生命周期示例结构对象树就是把控件组织起来让窗口在关闭时可以统一销毁所有子控件。不然窗口运行着一个控件突然消失这太不合理了二、对象树与内存管理对象树的核心作用就是自动管理内存父对象析构时Qt 会遍历对象树自动释放所有子对象这就是为什么new出来的控件不用delete也不会泄漏控件层级和事件传播父对象控制子对象显示和位置事件如鼠标点击会从子对象冒泡到父对象信号槽安全当父对象销毁时相关信号槽连接会自动断开信号槽我们后续也会学习到三、栈对象 vs 堆对象的对比1. 栈对象示例QLabellabel(this);label.setText(Hello World);栈上对象构造函数执行完毕后label被销毁窗口运行时控件已经不存在 →看不到 HelloWorld2. 堆对象示例QLabel*labelnewQLabel(this);label-setText(Hello World);堆上对象挂到父对象对象树生命周期由父对象管理窗口显示时控件仍然存在无需手动 deleteQt 会自动释放栈对象生命周期太短不适合 GUI 控件堆对象 对象树机制才是 Qt 推荐的做法。四、验证对象树自动析构的实验为了直观了解对象树的作用我们可以手动写一个类来观察析构过程。1. 新建自定义控件创建 C Class名字MyLabelBase Class 输入QLabel生成mylabel.h和mylabel.cpp2. 添加构造与析构函数// mylabel.hclassMyLabel:publicQLabel{Q_OBJECTpublic:MyLabel(QWidget*parent);// 必须写挂到对象树~MyLabel();};// mylabel.cpp#includemylabel.h#includeiostreamMyLabel::MyLabel(QWidget*parent):QLabel(parent){}MyLabel::~MyLabel(){std::coutdestroy Mylablestd::endl;}析构函数中打印信息用来观察对象被销毁的时机3. 在窗口中使用//widget.cppMyLabel*labelnewMyLabel(this);label-setText(Hello World);运行程序关闭窗口控制台输出说明对象树确实在父对象析构时自动销毁子对象验证了内存管理机制。五、小结Qt 的对象树是内存管理核心机制父对象负责管理子对象生命周期保证控件按层级安全释放堆分配控件 parent 指定 对象树管理避免内存泄漏栈对象生命周期过短不适合 GUI 控件实验验证了析构顺序和自动释放行为理解对象树对开发安全非常重要