1、Qt 对象间的关系
Qt 对象间可以存在父子关系
— 每一个对象都保存有它所有子对象的指针
— 每一个对象都有一个指向其父对象的指针
当指定 Qt 对象的父对象时
— 其父对象会在子对象链表中加入该对象的指针
— 该对象会保存指向其父对象的指针
#include <QCoreApplication> #include <QDebug> void fcTest() { QObject* p = new QObject(); QObject* c1 = new QObject(); QObject* c2 = new QObject(); c1->setParent(p); c2->setParent(p); qDebug() << "c1 = " << c1; qDebug() << "c2 = " << c2; const QObjectList& list = p->children(); //链表对象 for(int i = 0; i < list.length(); i++) { qDebug() << list[i]; } qDebug() << "p: " << p; qDebug() << "c1 parent: " << c1->parent(); qDebug() << "p2 parent: " << c2->parent(); } int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); fcTest(); return a.exec(); }
当Qt 对象被销毁时
— 将自己从父对象的 Children List 移除
— 将自己的 Children List 中的所有对象销毁
什么是Qt 对象:(定义一个类,继承于 QObject ,因此而产生的对象才叫 Qt 对象)
注:使用Qt 开发,不仅要时刻注意内存泄漏的问题,还要时刻关注对象是否可能被多次销毁的问题
利用Qt 对象间的父子关系可以构成对象树
删除树中的节点时会导致对应的子树被销毁
#include <QCoreApplication> #include <QDebug> class MObj :public QObject { private: QString m_name; public: MObj(const QString& name ) { m_name = name; qDebug() << "construct:" << m_name; } ~MObj() { qDebug() << "destruct:" << m_name; } }; void delTest() { MObj* obj1 = new MObj("obj1"); MObj* obj2 = new MObj("obj2"); MObj* obj3 = new MObj("obj3"); MObj* obj4 = new MObj("obj4"); obj2->setParent(obj1); obj4->setParent(obj3); obj3->setParent(obj1); delete obj3; qDebug() << "Obj2:" << obj2; const QObjectList& List = obj1->children(); for(int i = 0;i<List.length();i++) { qDebug() << List[i]; } } int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); delTest(); return a.exec(); }
小结:
Qt 对象间可以存在父子关系
通过父子关系能够得到 Qt 对象树
Qt 对象销毁时解除和父对象间的父子关系
Qt 对象销毁时将同时销毁所有的子对象
————————————————
版权声明:本文为CSDN博主「静下心来学Qt」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_35379003/article/details/103478440

