Qt使用对象树组织QObject
当以一个对象作为父对象创建QObject时,这个对象就会被添加到父对象的children()列表中,当父对象被delete时该对象也会被释放。
在析构一个对象obj时,会进行两个操作:
- 如果它有parent,它会从它的parent中移除。
- 如果它有children,它的所有children会自动delete。
记住,QT主要用来开发图形用户界面程序。这种对象的组织方法非常适合GUI对象的需求,
例如,QShortcut(键盘快捷方式)是相关窗口的子级,当用户关闭该窗口时,该快捷键也会被删除。
不仅如此,QWidget作为Qt Widgets模块的基本类(所有用户界面对象的基类),它还扩展了QObject的父子关系。
一个QWidget的子级成为了子级小部件,它在其父级的坐标系中显示,并根据其父级的边界以图形方式进行裁剪。
例如,当应用程序在关闭后删除消息框时,消息框的按钮和标签也会被删除,因为按钮和标签是消息框的子级。
QObject的构建/销毁顺序
根据对象创建方式需要分为两种情况来讨论:
1.在堆上创建(使用new创建)
当在堆上创建QObject时(即用new创建),可以以任何顺序创建对象、构造对象树。也可以以任何顺序销毁树中的对象。
2.在栈上创建
在栈上创建QObject时,通常销毁顺序仍然不会出现问题。
看下面这个例子: