码迷,mamicode.com
首页 > 其他好文 > 详细

第16课 Qt对象间的父子关系

时间:2016-05-01 01:11:52      阅读:252      评论:0      收藏:0      [点我收藏+]

标签:

1. Qt对象间的关系

(1)Qt对象间可以存在父子关系

  ①每一个对象都保存有它所有子对象的指针

  ②每一个对象都有一个指向其父对象的指针

技术分享 

(2)当指定Qt对象的父对象时

  ①其对象会在子对象链表中加入该对象的指针

  ②该对象会保存指向其父对象的指针

(3)当Qt对象被销毁

  ①将自己从父对象的Children List移除

  ②将自己的Children List中的所有对象销毁

  ▲使用Qt开发时,不仅要时刻注意内存泄露的问题,还要时刻关注对象是否可能被多次销毁的问题。

【编程实验】对象间的父子关系

#include <QApplication>
#include <QString>
#include <QDebug>//father-children测试
void fcTest()
{
    QObject* p = new QObject(); //只有QObject及子孙类之间才能够成父子关系
    QObject* c1 = new QObject();
    QObject* c2 = new QObject();
    
    c1->setParent(p);
    c2->setParent(p);
    
    //1.先打印c1和c2两个对象的地址
    qDebug() << "c1: " << c1; //打印c1的地址
    qDebug() << "c2: " << c2; //打印c2的地址

    //2.输出:通过p,输出其两个孩子的地址(期待结果为c1和c2)
    const QObjectList& list = p->children();
    for(int i = 0; i < list.length(); i++)
    {
        qDebug() << list[i];
    }

    qDebug() <<"p: " << p; //输出p的地址

    qDebug() << "c1->parent:" << c1->parent();
    qDebug() << "c2->parent: " << c2->parent();
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    
    fcTest();
      
    return a.exec();
}

(4)利用Qt对象间的父子关系可以构成对象树,删除树中的节点时会导致对应的子树被销毁

技术分享

 

【编程实验】对象的删除

#include <QApplication>
#include <QString>
#include <QDebug>

//Qt对象要从QObject中继承下来
class MObj: public QObject
{
    QString m_name;
public:
    MObj(const QString& name)
    {
        m_name = name;
        
        qDebug() << "Constructor:" << this << m_name;
    }
    
    ~MObj(){ qDebug() << "Destructor:" << this << m_name;}
};

//删除对象树某节点
void delTest()
{
    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; //删除obj3,会同时删除其孩子并将其从父对象链表中移除!

    const QObjectList& list = obj1->children();

    qDebug()<< "obj2: " << obj2;

    for(int i = 0; i < list.length(); i++)
    {
        qDebug() << list[i]; //obj1的孩子只剩obj2
    }
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    
    delTest();
      
    return a.exec();
}

2. 小结

(1)Qt对象间可以存在父子关系

(2)通过父子关系能够得到Qt对象树

(3)Qt对象销毁时解除和父对象间的父子关系

(4)Qt对象销毁时将同时销毁所有的子对象

 

第16课 Qt对象间的父子关系

标签:

原文地址:http://www.cnblogs.com/5iedu/p/5449808.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!