Qt对象树源码分析

Qt对象树

Qt提供了对象树机制,能够自动、有效的组织和管理继承自QObject的Qt对象。每个继承自QObject类的对象通过它的对象链表(QObjectList)来管理子类对象,当用户创建一个子对象时,其对象链表相应更新子类对象信息,对象链表可通过children()获取。当父对象析构的时候,其对象链表中的所有(子)对象也会被析构,父对象会自动将其从父对象列表中删除。Qt 保证没有对象会被 delete 两次。开发中手动回收资源时建议使用deleteLater代替delete,因deleteLater多次是安全的,而delete多次是不安全的。
简单来说就是当父类对象析构了其子类对象也会跟着析构,由QObject对象树上派生过来的类的每个实例化的对象都有一个自己的子对象链表来完成父类连带着子类析构这个特点。

在这里插入图片描述
在这里插入图片描述

析构子类2以后:跟着把孙类1和2都析构了

在这里插入图片描述

代码:


    MyLayout *sunlayout = new MyLayout(mylabel);//布局sunlayout以mylabel为父类
    
    MyPushButton *sunBtn1 = new MyPushButton;
    MyPushButton *sunBtn2 = new MyPushButton;
    MyPushButton *sunBtn3 = new MyPushButton;
    
    sunBtn1->setText("孙按钮1");
    sunBtn2->setText("孙按钮2");
    sunBtn3->setText("孙按钮3");
    
    //布局中加入各个按钮
    sunlayout->addWidget(sunBtn1);
    sunlayout->addWidget(sunBtn2);
    sunlayout->addWidget(sunBtn3);

实现实例析构:mylabel->deleteLater();

    qDebug()<<"****************mylabel析构******************";
    mylabel->deleteLater();
    
    const QObjectList listmylabel = mylabel->children();//读取mylabel的子类
    qDebug() << "mylabel.children()";
    foreach (QObject* obj,listmylabel){//通过容器进行读取各个子类
    qDebug() << obj;
    }

运行结果:
在这里插入图片描述
总结:Qt实现了这样的一个机制是为了方便程序员能够注重代码的实现避免程序员过度的去关注资源释放的问题。

猜你喜欢

转载自blog.csdn.net/Jacksqh/article/details/106527084