Qt对象间可以存在父子关系:
——每个对象都保存有它所有子对象的指针
——每个对象都有一个其父对象的指针
当指定Qt对象的父对象时:
——其父对象会在自己的子对象链表中加入该对象的指针
——该子对象会保存其父对象的指针
实验代码:
1、通过创建三个QObject 对象 p c1 c2
2、p 作为c1 c2的父对象
3、打印c1 c2 的地址
4、打印 p对象的子对象地址
5、打印 c1 c2 对象的父对象地址
6、比较证明上述结论
void testObjFunction(void)
{
QObject* p = new QObject();
QObject* c1 = new QObject();
QObject* c2 = new QObject();
c1->setParent(p);//设置c1 的父对象为p
c2->setParent(p);//设置c2 的父对象为p
qDebug() <<"c1"<< c1;
qDebug() <<"c2"<< c2;
const QObjectList& List = p->children();//获取子对象表
for(int i=0;i<List.length();i++)
{
qDebug()<<List[i];
}
qDebug();
qDebug()<<"p"<<p;
qDebug()<<"c1 parent"<<c1->parent();
qDebug()<<"c2 parent"<<c2->parent();
}
运行结果:
当Qt对象被销毁时:
——将自己从父对象的 Children List中移除
——在销毁自己时,将自己的 Childre List 中所有对象销毁
所以在开发是需要注意,内存泄漏与多次销毁的问题。
测试代码:
1、创建obj1 obj2 obj3 obj4
2、删除 obj3
3、打印obj1 中的 Children List 与obj2地址是否相等
void testObjFunction1()
{
qDebug();
MObj* obj1 = new MObj("obj1");
MObj* obj2 = new MObj("obj2");
MObj* obj3 = new MObj("obj3");
MObj* obj4 = new MObj("obj4");
obj2->setParent(obj1);//obj2 的父对象是obj1
obj3->setParent(obj2);//obj3 的父对象是obj2
obj4->setParent(obj3);//obj4 的父对象是obj3
QObjectList List1 = obj1->children();
delete obj3;
QObjectList List = obj2->children();
qDebug()<<"obj2"<<obj2;
for(int i=0;i<List.length();i++)
{
qDebug()<<List[i];
}
}
运行结果:
小结:
Qt对象间可以存在父子关系
通过父子关系能够得到qt对象树
Qt对象销毁时解除和父对象的父子关系
Qt对象销毁时将同时销毁所有的子对象