前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >7.QT-Qt对象间的父子关系

7.QT-Qt对象间的父子关系

作者头像
诺谦
发布2018-05-28 15:37:04
9060
发布2018-05-28 15:37:04
举报
文章被收录于专栏:Linux驱动Linux驱动

Qt对象之间可以存在父子关系

继承于QObject类或者其子类的对象,都称为Qt对象

当指定Qt对象的父对象时

  • 需要通过setParent()成员函数来设置对象间的父子关系
  • 子对象将会把自己的指针地址保存在父对象的children List链表里(因为父对象可以拥有多个子对象)
  • 子对象内部会有一个指向其父对象的指针,可以通过parent()成员函数查看

代码试验

需要用到的函数:

代码语言:javascript
复制
void QObject::setParent ( QObject * parent );     //设置为parent对象为自己的父对象

const  QObjectList & QObject::children ();      //返回一个QObjectList(子对象链表),里面保存了子对象地址.

QObject * QObject::parent ();                  //返回指向父对象的指针

代码如下:

代码语言:javascript
复制
#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

代码如下:

代码语言:javascript
复制
#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();
}

运行打印:

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-04-23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档