Qt 对象间的父子关系
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 对象间的父子关系的更多相关文章
- 7.QT-Qt对象间的父子关系
Qt对象之间可以存在父子关系 继承于QObject类或者其子类的对象,都称为Qt对象 当指定Qt对象的父对象时 需要通过setParent()成员函数来设置对象间的父子关系 子对象将会把自己的指针地址 ...
- RXJS组件间超越父子关系的相互通信
RXJS组件间超越父子关系的相互通信 用到这个的需求是这样的: 组件A有数据变化,将变化的数据流通知组件B接收这个数据流并做相应的变化 实例化RXJS的subject对象 import { Injec ...
- 让两个对象间建立weak关系
让两个对象间建立weak关系 这是为了给两个对象间建立weak关系,当一个对象被释放时,另外一个对象再获取这个值时就是nil,也就是不持有这个对象:) 源码: WeakRelatedDictionar ...
- 【原创】面向对象作业:选课系统中用pickle储存多个对象间组合引用关系的那些坑
转载请注明出处:https://www.cnblogs.com/oceanicstar/p/9030121.html 想直接看结论先提前列出: 1.存储一个对象,文件不是真的给你存储的了对象这种东西, ...
- 非常易于理解‘类'与'对象’ 间 属性 引用关系,暨《Python 中的引用和类属性的初步理解》读后感
关键字:名称,名称空间,引用,指针,指针类型的指针(即指向指针的指针) 我读完后的理解总结: 1. 我们知道,python中的变量的赋值操作,变量其实就是一个名称name,赋值就是将name引用到一个 ...
- QT场景视图父子关系图元打印研究
在之前的一篇文章中,实现了QT场景视图的打印功能,主要通过render函数来实现,非常简单和方便. 在实际的项目需求中,除了打印整个场景外,还需要对单个图形进行打印操作,基于item的图形可以在pai ...
- SQL Server 查看对象之间的引用关系
前期准备: use studioA; go create table T(X int,Y int); insert into T(X,Y) values(1,1),(2,2); ...
- 如何才能学到Qt的精髓——信号槽之间的无关性,提供了绝佳的对象间通讯方式,QT的GUI全是自己的一套,并且完全开源,提供了一个绝好机会窥视gui具体实现
姚冬,中老年程序员 叶韵.KY Xu.赵奋强 等人赞同 被邀请了很久了,一直在思考,今天终于下决心开始写回答. 这个问题的确是够大的,Qt的代码规模在整个开源世界里也是名列前茅的,这么大的项目其中的精 ...
- QT父子与QT对象delete
原地址:http://www.qteverywhere.com/archives/437 很多C/C++初学者常犯的一个错误就是,使用malloc.new分配了一块内存却忘记释放,导致内存泄漏.Qt的 ...
随机推荐
- 你需要了解的z-index世界
本文摘自:飘零雾雨的博客 z-index的重要性 在我看来,z-index 给了我们日常工作中以极大的帮助,我们用它来定义元素的层叠级别(stack level).受益于它,你能做Popup, Dro ...
- #Leet Code# Evaluate Reverse Polish Notation
描述:计算逆波兰表达法的结果 Sample: [", "*"] -> ((2 + 1) * 3) -> 9 [", "/", & ...
- Js处理数据——前端分页工具
这几天有小伙伴讨论起了分页的相关问题,这里我也简单讲下前端如何简单便捷的利用Js(库)写出优雅,好用的分页工具. 分页是个很简单又超多接触的技术点,粗略来讲分如下两种: 真分页--每次根据页码.页大小 ...
- 隐藏 Status Bar
iOS6和iOS7在隐藏 Status Bar 三种方式比较: Storyboard 界面上选中UIViewController,最右边Simulated Metrics找到 Status Bar 设 ...
- 多个div独立控制其显示/隐藏
今天要说一个神奇的html标签op,静态页下可以配合jquery分别控制每个层的显示/隐藏切换. 如果用动态中使用,用文章id做区分就可以了. <html> <head> &l ...
- [Android应用]《花界》V1.0 正式版隆重发布!
http://www.cnblogs.com/qianxudetianxia/archive/2012/04/05/2433669.html 1. 软件说明(1). 花界是一款看花软件:“看花,议花, ...
- UIKIT网页基本结构学习
没办法,哈哈,以后一段时间,如果公司没有招到合适的运维研发, 啥啥都要我一个人先顶上了~~~:) 也好,可以让人成长. UIKIT,BOOTSTRAP之类的前端,搞一个是有好处的,我们以前即然是用了U ...
- 使用IRP进行文件操作
使用IRP进行文件操作 首先声明这个是菜鸟—我的学习日记,不是什么高深文章,高手们慎看. 一定要先感谢为技术的进步而付出辛勤汗水的人,感谢他们对技术的共享. 一个通用IRP访问文件的十六进制编辑器(开 ...
- C++开发与Windows API
Windows API 向 C++ 开发人员提出了一项挑战. 组成 API 的众多库大都表现为 C 语言风格的函数和句柄或是 COM 风格的接口. 这些用起来都不太方便,需要进行一定的封装或间接操作. ...
- USACO3.41Closed Fences(几何)
这题水的真不易..300多行 累死了 对着数据查错啊 枚举每个边上的点到源点 是否中间隔着别的边 每条边划分500份就够了 注意一下与源点在一条直线上的边不算 几何 啊,,好繁琐 参考各种模版.. ...