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


少有人走的路
















