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

运行打印:

7.QT-Qt对象间的父子关系的更多相关文章

  1. Qt 对象间的父子关系

    C++中只要有一个new就必须要有一个delete与之对应 但是Qt中的对象之间有特殊的关系 Qt 对象间的父子关系 每一个对象都保存有它所有子对象的指针 每一个对象都有一个指向其父对象的指针 par ...

  2. RXJS组件间超越父子关系的相互通信

    RXJS组件间超越父子关系的相互通信 用到这个的需求是这样的: 组件A有数据变化,将变化的数据流通知组件B接收这个数据流并做相应的变化 实例化RXJS的subject对象 import { Injec ...

  3. 让两个对象间建立weak关系

    让两个对象间建立weak关系 这是为了给两个对象间建立weak关系,当一个对象被释放时,另外一个对象再获取这个值时就是nil,也就是不持有这个对象:) 源码: WeakRelatedDictionar ...

  4. 【原创】面向对象作业:选课系统中用pickle储存多个对象间组合引用关系的那些坑

    转载请注明出处:https://www.cnblogs.com/oceanicstar/p/9030121.html 想直接看结论先提前列出: 1.存储一个对象,文件不是真的给你存储的了对象这种东西, ...

  5. 非常易于理解‘类'与'对象’ 间 属性 引用关系,暨《Python 中的引用和类属性的初步理解》读后感

    关键字:名称,名称空间,引用,指针,指针类型的指针(即指向指针的指针) 我读完后的理解总结: 1. 我们知道,python中的变量的赋值操作,变量其实就是一个名称name,赋值就是将name引用到一个 ...

  6. SQL Server 查看对象之间的引用关系

    前期准备: use studioA;           go create table T(X int,Y int); insert into T(X,Y) values(1,1),(2,2);  ...

  7. 如何才能学到Qt的精髓——信号槽之间的无关性,提供了绝佳的对象间通讯方式,QT的GUI全是自己的一套,并且完全开源,提供了一个绝好机会窥视gui具体实现

    姚冬,中老年程序员 叶韵.KY Xu.赵奋强 等人赞同 被邀请了很久了,一直在思考,今天终于下决心开始写回答. 这个问题的确是够大的,Qt的代码规模在整个开源世界里也是名列前茅的,这么大的项目其中的精 ...

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

    第三回 父与子 70后的道友都应该看过这么一部片子叫做<<父子情深>>.讲述的是一个小男孩患了绝症,父亲为了满足他的愿望,让已关门的游乐园为他们父子俩重新开放.在游乐园尽情地玩 ...

  9. QT场景视图父子关系图元打印研究

    在之前的一篇文章中,实现了QT场景视图的打印功能,主要通过render函数来实现,非常简单和方便. 在实际的项目需求中,除了打印整个场景外,还需要对单个图形进行打印操作,基于item的图形可以在pai ...

随机推荐

  1. #254 Reverse a String

    翻转字符串 先把字符串转化成数组,再借助数组的reverse方法翻转数组顺序,最后把数组转化成字符串. 你的结果必须得是一个字符串 这是一些对你有帮助的资源: Global String Object ...

  2. Android学习笔记(2):build.grandle的常用设置

    1 > java开发中有两个大名鼎鼎的项目构建ANT.Maven. 2 > Google推荐使用的Android Studio是采用Gradle来构建项目的.Gradle是一个非常先进的项 ...

  3. Rabbitmq的使用及Web监控工具使用

    本文转载自:https://www.cnblogs.com/gossip/p/4475978.html windows安装手册请参考:http://www.rabbitmq.com/install-w ...

  4. [转] KVM storage performance and cache settings on Red Hat Enterprise Linux 6.2

    Almost one year ago, I checked how different cache settings affected KVM storage subsystem performan ...

  5. CSS实现div高度自适应

    1.有时候,我们希望容器有一个固定高度,但当其中的内容多的时候,又希望高度能够自适应,也即容器在纵向能被撑开,且如果有背景,也能够自适应.在一般情况下,使用min-height即可解决.但是广大网民的 ...

  6. SpringBoot开源项目(企业信息化基础平台)

    JEEPlatform 一款企业信息化开发基础平台,可以用于快速构建企业后台管理系统,集成了OA(办公自动化).SCM(供应链系统).ERP(企业资源管理系统).CMS(内容管理系统).CRM(客户关 ...

  7. Python - 网络爬虫(Web Scraping)

    专栏 从零开始写Python爬虫:https://zhuanlan.zhihu.com/Ehco-python requests库的安装与使用:http://t.cn/RTuUuf7 BS4库的安装与 ...

  8. python基础-循环语句(5)

    一.循环语句介绍 一般情况下,需要多次重复执行的代码,都可以用循环的方式来完成 循环不是必须要使用的,但是为了提高代码的重复使用率,所以有经验的开发者都会采用循环 二.常见的循环形式 while循环 ...

  9. VueJs(6)---V-on指令

    V-on指令 一.概述 v-on是用来绑定事件监听器,用在普通元素上时,只能监听原生 DOM 事件.用在自定义元素组件上时,也可以监听子组件触发的自定义事件. 在监听原生 DOM 事件时,方法以事件为 ...

  10. 聊聊JVM(二)说说GC的一些常见概念

    转自CSDN 上一篇总结GC的基础算法,各种GC收集器的基本原理,还是比较粗粒度的概念.这篇会整理一些GC的常见概念,理解了这些概念,相信对GC有更加深入的理解 1. 什么时候会触发Minor GC? ...