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

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

时间: 2024-10-31 12:15:33

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

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

Qt对象之间可以存在父子关系 继承于QObject类或者其子类的对象,都称为Qt对象 当指定Qt对象的父对象时 需要通过setParent()成员函数来设置对象间的父子关系 子对象将会把自己的指针地址保存在父对象的children List链表里(因为父对象可以拥有多个子对象) 子对象内部会有一个指向其父对象的指针,可以通过parent()成员函数查看 代码试验 需要用到的函数: void QObject::setParent ( QObject * parent ); //设置为parent对

让两个对象间建立weak关系

这是为了给两个对象间建立weak关系,当一个对象被释放时,另外一个对象再获取这个值时就是nil,也就是不持有这个对象:) 源码: WeakRelatedDictionary.h 与 WeakRelatedDictionary.m // // WeakRelatedDictionary.h // TestDemo // // Created by YouXianMing on 14-9-25. // Copyright (c) 2014年 YouXianMing. All rights reser

13. 查看数据库对象间的依赖关系

在SQL Server中,(可编程)对象间的引用即依赖关系,有多种方式可以检查,随着版本变更,方式也有所不同. 父子关系的对象,不通过依赖关系来查询,比如: 1. 外键关系 use tempdb GO --drop table tb1,tb2 create table tb1 ( col1 int Primary key, col2 int ) insert into tb1 values (2,2),(3,2),(4,2),(5,2) GO create table tb2 ( col3 in

QT之对象父子关系

QT对象间可以存在父子关系: 1.每一个对象都保存有它所有子对象的指针 2.每一个对象都有一个指向其父对象的指针 其关系如下图所示: 当指定QT对象的父对象时,其父对象会在子对象链中表中会加入该对象的指针,该对象会保存指向其父对象的指针.我们在QT中创建了3个 QObject 对象,我们让 c1.c2 的父对象指向 p,那么我们打印 c1 和 c2 的地址以及 p 的子对象链表里的地址.如下所示:打印的结果如下:事实证明了确实如我们所想的那样,QT对象间可以存在父子关系.那么当Qt对象被销毁时,

QT窗口组件的父子关系

部分图文参考狄泰软件学院相关内容 1.QT对象间可以存在父子关系 (1)每一个对象都保存有它所有子对象的指针 (2)每一个对象都有一个指向其父对象的指针 2.当指定QT对象的父对象时 (1)其父对象会在对象链表中加入该对象的指针 (2)该对象会保存指向父对象的指针 3.当QT对象被销毁时 (1)将自己父对象的Chidrea_ List移除 (2)将自己的Children List中所有对象销毁 (3)利用QT对象间的父子关系可以构成对象树 (4)删除书中的节点会导致对应子树被销毁 注意:使用QT

Linux Shell的父子关系及内建命令

Linux Shell的父子关系及内建命令 Shell的类型 系统启动什么样的shell程序取决于你个人的用户ID配置.在/etc/passwd文件中,在用户ID记录的第7个字段中列出了默认的shell程序.只要用户登录到某个虚拟控制台终端或是在GUI中启动终端仿真器,默认的shell程序就会开始运行. 在下面的例子中,用户xiaoyu使用了GNU bash shell作为自己的默认shell程序: 1 [email protected]:/$ cat /etc/passwd 2 [...] 3

第73课 Qt中的多线程编程

1. QThread类 (1)QThread是一个跨平台的多线程解决方案 (2)QThread以简洁易用的方式实现多线程编程 2. QThread中的关键成员函数 (1)virtual void run() :线程函数,用于定义线程功能(执行流). (2)void start():启动函数,将线程入口地址设置为run函数.启动线程,新线程开始执行run函数. (3)int exec():进入事件循环,直至调用exit().返回线程退出事件循环的返回码. (4)void terminate():强

详解 Qt 线程间共享数据(用信号槽方式)

使用共享内存.即使用一个两个线程都能够共享的变量(如全局变量),这样两个线程都能够访问和修改该变量,从而达到共享数据的目的. Qt 线程间共享数据是本文介绍的内容,多的不说,先来啃内容.Qt线程间共享数据主要有两种方式: 使用共享内存.即使用一个两个线程都能够共享的变量(如全局变量),这样两个线程都能够访问和修改该变量,从而达到共享数据的目的: 使用singal/slot机制,把数据从一个线程传递到另外一个线程. 第一种办法在各个编程语言都使用普遍,而第二种方式倒是QT的特有方式,下面主要学习一

Qt那点事儿(三) 论父对象与子对象的关系

第三回 父与子 70后的道友都应该看过这么一部片子叫做<<父子情深>>.讲述的是一个小男孩患了绝症,父亲为了满足他的愿望,让已关门的游乐园为他们父子俩重新开放.在游乐园尽情地玩耍后,最后小孩子在父亲的怀中安详地闭上了眼睛.缓缓转动的摩天轮,配着淡淡忧伤的曲调,这一刻哥泪流满面.谁说世上只有妈妈好,父爱也顶半边天.此时台下的众多男道友热泪盈眶,不约而同地起立鼓掌.史上最大的冤屈,终于得以昭雪. 但是人世间这种真挚的父爱也存在于Qt中吗? 对此,从小缺乏父爱的张无忌小友给出了自己的答案