Qt對象之間可以存在父子關系
繼承於QObject類或者其子類的對象,都稱為Qt對象
當指定Qt對象的父對象時
- 需要通過setParent()成員函數來設置對象間的父子關系
- 子對象將會把自己的指針地址保存在父對象的children List鏈表里(因為父對象可以擁有多個子對象)
- 子對象內部會有一個指向其父對象的指針,可以通過parent()成員函數查看
代碼試驗
需要用到的函數:
void QObject::setParent ( QObject * parent ); //設置為parent對象為自己的父對象 const QObjectList & QObject::children (); //返回一個QObjectList(子對象鏈表),里面保存了子對象地址. QObject * QObject::parent (); //返回指向父對象的指針
代碼如下:
#include <QtCore/QCoreApplication> #include <QDebug> class MObj : public QObject { }; void func() { MObj *obj1 = new MObj; MObj *obj2 = new MObj; MObj *obj3 = new MObj; qDebug()<<"obj1 ="<<obj1; qDebug()<<"obj2 ="<<obj2; qDebug()<<"obj3 ="<<obj3; qDebug(); obj2->setParent(obj1); //設置obj1為obj2的父對象 obj3->setParent(obj1); //設置obj1為obj3的父對象 const QObjectList& list =obj1->children(); //獲取obj1 的children list for(int i=0; i<list.length();i++) { qDebug()<<"children list:"<<list[i]<<endl; } qDebug()<<"obj2 parent:"<<obj2->parent(); qDebug()<<"obj3 parent:"<<obj3->parent(); } int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); func(); return a.exec(); }
運行打印:
當Qt對象被銷毀時
- 將自己的地址從父對象的鏈表children List里移除
- 將自己的子對象鏈表children List中的所有子對象摧毀(delete掉)
所以, delete某個Qt對象時,還需要注意它有沒有子對象,如下圖所示:
代碼試驗delete
代碼如下:
#include <QDebug> #include <QString> class MObj : public QObject { private: QString mvalue; public: MObj(QString i=0):mvalue(i) {} ~MObj() { qDebug()<<"~Mobj : "<<mvalue; } }; void func() { MObj *obj1 = new MObj("obj1"); MObj *obj2 = new MObj("obj2"); MObj *obj3 = new MObj("obj3"); MObj *obj4 = new MObj("obj4"); obj2->setParent(obj1); obj3->setParent(obj1); obj4->setParent(obj3); delete obj3; } int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); func(); return a.exec(); }
運行打印: