7.QT-Qt对象间的父子关系
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对象间的父子关系的更多相关文章
- Qt 对象间的父子关系
C++中只要有一个new就必须要有一个delete与之对应 但是Qt中的对象之间有特殊的关系 Qt 对象间的父子关系 每一个对象都保存有它所有子对象的指针 每一个对象都有一个指向其父对象的指针 par ...
- 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引用到一个 ...
- 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那点事儿(三) 论父对象与子对象的关系
第三回 父与子 70后的道友都应该看过这么一部片子叫做<<父子情深>>.讲述的是一个小男孩患了绝症,父亲为了满足他的愿望,让已关门的游乐园为他们父子俩重新开放.在游乐园尽情地玩 ...
- QT场景视图父子关系图元打印研究
在之前的一篇文章中,实现了QT场景视图的打印功能,主要通过render函数来实现,非常简单和方便. 在实际的项目需求中,除了打印整个场景外,还需要对单个图形进行打印操作,基于item的图形可以在pai ...
随机推荐
- Android开发者的Anko使用指南(三)之资源
添加依赖 dependencies { compile "org.jetbrains.anko:anko-commons:$anko_version" } Color 0xff00 ...
- linux根目录介绍
1. /bin binary二进制 存放系统许多可执行程序文件 执行的相关指令,例如ls pwd whoami,后台的支持文件目录 2. /sbin super binary超级的二进制 存放系统许多 ...
- hive 添加和删除分区
命令如下: 增加分区 ', p_loctype='MHA'); 删除分区 ALTER TABLE my_partition_test_table DROP IF EXISTS PARTITION (p ...
- Django搭建博客记(一)
这里记录一些 Django 搭建博客遇到的一些问题 参考书籍为 Django by Example, 这里记录与书籍内容不包含的内容. 搭建环境: 阿里云 ECS + CentOS7 一开始搭建的时候 ...
- iis发布后模板字体不能加载的解决方案
在使用ace模板的过程中就曾遇到过图标不显示的情况, 1.在iis和vs运行都不能显示图标,添加缺失的字体库后可以访问 2.把项目签入到阿里云时再一次失效,解决方法是添加Mime类型 .woff a ...
- win10 系统下无法正常安装 Anaconda3
最近国庆两天,突然心血来潮重装了一遍系统,重装成了win10系统以后毛病百出哇,昨天和今天一直在解决一个问题,那就是安装Anaconda3的时候出现不了快捷方式,如下图这样只有一个快捷方式(在win7 ...
- JavaPoet开源项目的使用
一.介绍 JavaPoet项目可以动态的生成Java文件,这是一个很强大和很动态的方法,使用注解的时候假如需要生成新的Java文件就可以通过这个开源项目实现. 项目地址:https://github. ...
- 第33节:Java面向对象中的异常
Java中的异常和错误 Java中的异常机制,更好地提升程序的健壮性 throwable为顶级,Error和Exception Error:虚拟机错误,内存溢出,线程死锁 Exception:Runt ...
- lua模块demo(redis,http,mysql,cjson,本地缓存)
1. lua模块demo(redis,http,mysql,cjson,本地缓存) 1.1. 配置 在nginx.conf中设置lua_shared_dict my_cache 128m; 开启ngi ...
- 使用 VS Code 开发和调试 .NET Core 程序
电脑不想装几十个G的 VS2017,那就用 VS Code 吧 目标: 创建一个类库项目 Skany.Core,并用 Nuget 引用第三方组件 Hash 实现加密算法 创建一个单元测试项目 Skan ...