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