文章目录
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 对象销毁时将同时销毁所有的子对象