16-Qt 对象间的父子关系

1. QT中的父子关系

  • QT 对象间可以存在父子关系
    • 每一个对象都保存有它的所有子对象的指针
    • 每一个对象都有一个执行其父对象的指针
  • 当指定 QT 对象的父对象时,其父对象会在子对象链表中加入该对象的指针,该对象会保存指向其父对象的指针
#include <QCoreApplication>
#include <QDebug>
#include <QList>

class Test : public QObject
{
    QString my;
public:
    Test(QString str)
    {
        my = str;
    }
    ~Test()
    {
        qDebug()<<my;
    }
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    Test *ptr1 = new Test("ptr1");
    qDebug()<<"ptr1: "<<ptr1;

    Test *ptr2 = new Test("ptr1");
    ptr2->setParent(ptr1);
    qDebug()<<"ptr2: "<<ptr2<<"  parent: "<<ptr1;
    Test *ptr3 = new Test("ptr1");
    ptr3->setParent(ptr1);
    qDebug()<<"ptr3: "<<ptr3<<"  parent: "<<ptr1<<"\n";

    const QObjectList &childrenList = ptr1->children();
    qDebug()<<"Children:";
    for(int i=0;i<childrenList.length();i++)
    {
        qDebug()<<childrenList[i];
    }


    return a.exec();
}

执行结果:

在这里插入图片描述

2. QT 对象树

  • 当 QT 对象被销毁时
    • 将自己从父对象的 Children List 移除
    • 将自己的 Children List 中的所有对象销毁
  • 利用 QT 对象间的父子关系可以构成对象树
  • 删除树种的节点时会导致对应的子树被销魂
#include <QCoreApplication>

class Test : public QObject
{
    QString my;
public:
    Test(QString str)
    {
        my = str;
    }
    ~Test()
    {
        qDebug()<<my;
    }
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    Test *ptr1 = new Test("ptr1");

    Test *ptr2 = new Test("ptr2");
    ptr2->setParent(ptr1);
    Test *ptr3 = new Test("ptr3");
    ptr3->setParent(ptr1);

    delete ptr1;  // 销毁父对象

    return a.exec();
}

执行结果:

在这里插入图片描述

3. 总结

  • QT 对象间可以存在父子关系
  • 通过父子关系能够得到 QT 对象树
  • QT 对象销毁时解除和父对象间的父子关系
  • QT 对象销毁时将同时销毁所有的子对象
发布了61 篇原创文章 · 获赞 31 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/qq_40794602/article/details/105594460