C++中只要有一个new就必须要有一个delete与之对应

但是Qt中的对象之间有特殊的关系

Qt 对象间的父子关系

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

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

parent里面有个链表 链表的每一个元素都是就是指向子对象的 指针

类似的每一个子对向都保存了一个指向父对象的指针

Qt中的对象如何指定其父对象?

成员函数:setparent;

当调用setparent函数时,父对象将子对像加入到自己的链表中,子对像将一个指针指向父对象,这样对象就产生了父子关系。

为证明上述新建一个控制台的应用程序

#include <QCoreApplication>
#include <QDebug>
void fcTest()
{
QObject* p = new QObject();
QObject* c1 = new QObject();
QObject* c2 = new QObject(); c1->setParent(p);//该函数执行后p执行那个的对象就变成了父类的对象
c2->setParent(p); qDebug() << "c1: " << c1;//输出c1对象的地址
qDebug() << "c2: " << c2; const QObjectList& list = p->children(); for(int i=0; i<list.length(); i++)//Qt中提供了想访问数组的方式访问这个链表
{
qDebug() << list[i];
} qDebug() << "p: " << p; qDebug() << "c1 parent: " << c1->parent();//函数返回父对象的指针
qDebug() << "c2 parent: " << c2->parent();
} int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv); fcTest();
return a.exec();
}

 如果对代码中的成员函数不理解可以到Qt的帮助文档中直接找其说明

方法:1、搜索QObject类

2、在该类的成员函数中找对应的函数了即可得到该函数的说明:Makes the object a child of parent.即指定一个对象的父类。

对于const QObjectList& list = p->children();同样使用上面Qt中的文档找到:

const QObjectList & QObject::​children() const

Returns a list of child objects. The QObjectList class is defined in the <QObject> header file as the following:

typedef QList<QObject*> QObjectList;

可以知道该函数的返回值const QObjectList &类型的链表

其中QObjectList 又是一个 QList<QObject*>  即是一个链表,链表中的元素又是QObject对象类型指针

 

Qt对象销毁时又会有那些事情?

当Qt对象被销毁时,很有可能不止一个对象被销毁,因为其销毁时,会将该对象的子对象链表中的所有对象都销毁。

通过setparent就可以形成上面的对象数,当删除obj3时,其子类obj4的对象也要会销毁。

为证明上面的结论:

创建一个继承QObject的类

 class MObj:public QObject
{ QString m_name;
public:
MObj(const QString& name)
{
m_name=name;
qDebug()<<"Constructor:"<<m_name;
} ~MObj()
{
qDebug() << "Destructor: " << 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); //删除obj3
delete obj3; //delete obj4;如果再次delete obj4就会出错,
//由于obj4已经被delete了,此时obj4是一个野指针,delete野指针肯定会内存出错的
}

完整代码:

 #include <QCoreApplication>
#include <QDebug>
#include <QString> class MObj:public QObject
{ QString m_name;
public:
MObj(const QString& name)
{
m_name=name;
qDebug()<<"Constructor:"<<m_name;
}
~MObj()
{
qDebug() << "Destructor: " << 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);
//删除obj3
delete obj3;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
delTest();
return a.exec();
}

结果:

可以看到析构函数被调用了两次,包括obj4和obj3

小结:

学习狄泰软件Qt实验教程学习笔记16课

Qt 对象间的父子关系的更多相关文章

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

    Qt对象之间可以存在父子关系 继承于QObject类或者其子类的对象,都称为Qt对象 当指定Qt对象的父对象时 需要通过setParent()成员函数来设置对象间的父子关系 子对象将会把自己的指针地址 ...

  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. QT场景视图父子关系图元打印研究

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

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

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

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

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

  9. QT父子与QT对象delete

    原地址:http://www.qteverywhere.com/archives/437 很多C/C++初学者常犯的一个错误就是,使用malloc.new分配了一块内存却忘记释放,导致内存泄漏.Qt的 ...

随机推荐

  1. HTML css面试题

    1.对WEB标准以及W3C的理解与认识 标签闭合.标签小写.不乱嵌套.提高搜索机器人搜索几率.使用外链css和js脚本.结构行为表现的分离.文件下载与页面速度更快.内容能被更多的用户所访问.内容能被更 ...

  2. Linux Makefile analysis for plain usr

    一.本文主旨 笔者写了一篇linux内核Makefile整体分析 ,测重于理论分析,对于实际应用不算对头,所以需要写一篇实用性较强的文章,为以后内核.驱动移植做好铺垫. 二.本文内容概要 1.编译哪些 ...

  3. Redis总录

    设计 选择合适的数据对象来存储对象:String,List,Hash(Entity角色对象),Set,Zset(需要排序): 选择存储是全局的,还是局部的: 机制 批处理(pipeline) 事务(w ...

  4. html 各个标签初始化

    html,body,div,ul,li,ol,h1,h2,h3,h4,h5,h6,span,input{  margin:0;padding:0;}body{font:12px/1.5em " ...

  5. android开发环境重装系统之后的配置

    前提: 之前配置好的android开发环境:重装系统:压缩了android目录 配置: 安装java环境 安装; 建立JAVA_HOME变量:JAVAHOME添加到path变量 JAVA_HOME=C ...

  6. 解决在HTTPS页面里嵌套HTTP页面浏览器block的问题

    问题描述: 浏览器默认是不允许在HTTPS里面引用HTTP页面的,ie下面会弹出提示框提示是否显示不安全的内容,一般都会弹出提示框,用户确认后才会继续加载,但是chrome下面直接被block掉,只在 ...

  7. 定时显示div

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " http://www.w3.org ...

  8. nutch2.2.1

    http://blog.csdn.net/leave00608/article/details/17442163 https://svn.apache.org/repos/asf/nutch/tags ...

  9. python中enumerate的使用

    在python的应用中,当我们使用一个数组或者列表的时候既要遍历索引又要遍历元素的时候通常的做法是这样的: >>> lsi = [1,2,3,4,5,6,7,8,9] >> ...

  10. Gabor变换

    Gabor变换 Gabor变换属于加窗傅立叶变换,Gabor函数可以在频域不同尺度.不同方向上提取相关的特征.另外Gabor函数与人眼的生物作用相仿,所以经常用作纹理识别上,并取得了较好的效果.Gab ...