7.QT-Qt對象間的父子關系


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();
}

運行打印:

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM