qt 中的对象树
本节内容讲解了什么是对象树以及其所带来的 GUI 编程好处。最后说明了在对象树中析构顺序问题并举了个特殊的例子,来说明平时编程中需要注意的一个点。
什么是对象树?
我们常常听到 QObject 会用对象树来组织管理自己,那什么是对象树?
这个概念非常好理解。因为 QObject 类就有一个私有变量 QList<QObject *>,专门存储这个类的子孙后代们。比如创建一个 QObject 并指定父对象时,就会把自己加入到父对象的 childre() 列表中,也就是 QList<QObject *> 变量中。
使用对象树模式有什么好处?
好处就是:当父对象被析构时子对象也会被析构。
举个例子,有一个窗口 Window,里面有 Label标签、TextEdit文本输入框、Button按钮这三个元素,并且都设置 Window 为它们的父对象。这时候我做了一个关闭窗口的操作,作为程序员的你是不是自然想到将所有和窗口相关的对象析构啊?古老的办法就是一个个手动 delete 呗。是不是很麻烦?Qt 运用对象树模式,当父对象被析构时,子对象自动就 delete 掉了,不用再写一大堆的代码了。
所以,对象树在 GUI 编程中是非常非常有用的。
注意构建/析构 QObject 的顺序问题
正常情况下,最后被创建出来的会先被析构掉。就好比我有一个大桌子,上面先摆放一个盘子,再摆放一个碗。当我要把桌子撤掉的时候,会先撤掉碗,再撤掉盘子,最后撤掉桌子。
用代码来演示一下:
正常情况
int main()
{
QWidget window;
QPushButton quit("Quit", &window);
}
后创建的 quit 对象指定了 window 为其父对象。那么关闭程序时,会先调用它的析构函数,然后调用 window 的析构函数。
一个特殊情况
int main()
{
QPushButton quit("Quit");
QWidget window;
quit.setParent(&window);
}
如果反过来,由于 window 后创建,程序关闭时先调用 window 的析构函数(此时 quit 被第一次析构)。接着调用 quit 的析构函数(此时 quit 被第二次析构),这时由于被两次析构,所以出问题了。
这种特殊情况在编程中很隐蔽,不容易发现。因为编译的时候不会报错,只有运行时才会产生问题。所以我们要保持良好的编程习惯以及对事物产生顺序有科学的认知。
相关文章
- Qt是什么?Qt简介(非常全面)
- 什么是linux Qt[通俗易懂]
- qt 当前窗口句柄_QT获取窗口句柄
- Qt Designer快速入门(python GUI 可视化界面搭建)
- 编程Linux下Qt实例编程:从入门到精通(linux下qt实例)
- Linux下 Qt 安装指南(linux下qt的安装)
- 基于Linux的Qt程序开发实践(linux与qt程序设计)
- Linux 环境下运用 Qt 编程的秘籍(linux下的qt编程)
- Linux环境下Qt交叉编译实战(linux交叉编译qt)
- Linux下高效安装Qt(linux下安装qt)
- Linux上Qt的快速安装(linux下载qt)
- 简明易懂的Linux下QT安装指南(linux下安装qt教程)
- 在Linux下探索Qt程序的奥秘(linux下运行qt程序)
- 的整合『使用 Qt 与MySQL实现创新性的数据库应用』(qt与mysql)
- Qt跨平台编译MySQL驱动实践(qt编译mysql驱动)
- QT快速加载MySQL驱动的简单操作(qt加载mysql驱动)
- 使用Qt在Linux上实现软键盘(qtlinux软键盘)
- 深入浅出:Qt在嵌入式Linux中的开发(qt嵌入式linux)
- 使用Linux系统成功运行QT程序的步骤与技巧(linux运行qt程序)
- 深入浅出:使用Qt连接MSSQL(qt 连接mssql)
- MySQL驱动Qt开发:新开发者的进阶指南(mysql驱动 qt)
- Qt如何编译Oracle数据库驱动(qt编译oracle驱动)
- 「Linux Qt SDK开发新时代:简单快速轻松上手」(linux qt sdk)
- 开启Linux之旅:Qt技术助力PDF转换(linuxqtpdf)
- MySQL和QT不配套使用,无法实现事务处理(mysql不支持qt事务)
- Redis与Qt实现完美连接(redis连接qt)
- Redis使用Qt解决读写互斥问题(redis读写互斥qt)