QT -- 对象树模型

1年前 (2023) 程序员胖胖胖虎阿
132 0 0

在Qt中当你创建一个QObject对象的时候会提供一个Parent对象指针,QObject的构造函数接收一个QObject指针作为参数,这个参数就是 parent,即父对象指针。

且父对象维护着一个children()列表,在创建QObject对象时,QObject对象会自动添加到其父对象的children()列表,当父对象析构的时候,这个列表中的所有对象也会被析构。

  • 每个继承自QObject类的对象通过它的对象链表(QObjectList)来管理子类对象,当用户创建一个子对象时,其对象链表相应更新子类对象信息,对象链表可通过children()获取。
  • 当父对象析构的时候,其对象链表中的所有(子)对象也会被析构,父对象会自动将其从父对象列表中删除。Qt 保证没有对象会被 delete 两次。开发中手动回收资源时建议使用deleteLater代替delete,因deleteLater多次是安全的,而delete多次是不安全的

QWidget是能够在屏幕上显示的一切组件的父类。QWidget继承自QObject,即也继承了对象树这种关系

注意构建/析构 QObject 的顺序问题
例1:

{
   QWidget window;
   QPushButton btn("button", &window);
}

先创建window,后创建btn。标准 C++要求,局部对象的析构顺序应该按照其创建顺序的相反过程。因此,这段代码在超出作用域时,会先调用 btn 的析构函数,将其从父对象 window 的子对象列表中删除,然后才会再调用 window 的析构函数。

例2:

{
    QPushButton btn("button");
    QWidget window;
    btn.setParent(&window);
}

先创建btn,后创建window。因为 window 后创建,这段代码在超出作用域时,先调用 window 的析构函数(此时 btn 被第一次析构)。接着调用 btn 的析构函数(此时 btn 被第二次析构),这时由于被两次析构,C++ 不允许调用两次析构函数,因此程序会崩溃。

因此需要养成良好的习惯。在 Qt 中,尽量在构造的时候就指定 parent 对象。!!!
QT -- 对象树模型

版权声明:程序员胖胖胖虎阿 发表于 2023年3月21日 下午7:48。
转载请注明:QT -- 对象树模型 | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...