Qt 对象间的父子关系

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

posted @ 2020-02-04 17:16  Dipsyhu  阅读(833)  评论(0编辑  收藏  举报