第十六课、Qt对象间的父子关系------------------狄泰软件学院
一、Qt对象间的关系
1、Qt对象间可以存在父子关系
(1)、每个对象都保存有它所有子对象的指针
(2)、每一个对象都有一个指向其父对象的指针
2、当指定Qt对象的父对象时
(1)、其父对象会在子对象链表中加入该对象的指针
(2)、该对象会保存指向其父对象的指针
![](/assets/blank.gif)
![](/assets/blank.gif)
#include <QtCore/QCoreApplication> #include <QDebug>int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);QObject* p = new QObject();QObject* c1 = new QObject();QObject* c2 = new QObject();c1->setParent(p);c2->setParent(p);qDebug() << c1;qDebug() << c2;const QObjectList list = p->children();for(int i=0; i<list.length(); i++){qDebug() << list[i];//打印的两个分别与c1和c2一样 }qDebug() << c1->parent();qDebug() << c2->parent();qDebug() << p;//三个打印的值都一样return a.exec(); }
View Code
3、当对象被销毁时
(1)、将自己从父对象的Children List移除
(2)、将自己的Children List中的所有对象销毁
注:使用Qt开发时,不仅要时刻注意内存泄漏的问题,还要时刻关注对象是否可能被多次销毁的问题
4、对象树
(1)、利用Qt对象间的父子关系可以构成对象树
(2)、删除树中的节点时会导致对应的子树被销毁
![](/assets/blank.gif)
![](/assets/blank.gif)
#include <QtCore/QCoreApplication> #include <QDebug> class MObj : public QObject//Qt对象采用父子间的关系 {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);delete obj3;//会同时销毁obj3和obj4// delete obj4;//运行会发生错误,相当于对obj4销毁了两次const QObjectList& list = obj1->children();qDebug() << "obj2: " << obj2;for(int i=0; i<list.length(); i++){qDebug() << list[i];}}int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);delTest();return a.exec(); }
View Code
二、小结
(1)、Qt对象间可以存在父子关系
(2)、通过父子关系能够获得Qt对象树
(3)、Qt对象销毁时解除和父对象间的父子关系
(4)、Qt对象销毁时将同时销毁所有的子对象
转载于:https://www.cnblogs.com/gui-lin/p/6399250.html
第十六课、Qt对象间的父子关系------------------狄泰软件学院相关推荐
- 第五十二课、命令行参数的应用------------------狄泰软件学院
一.主窗口的状态参数 1.主窗口的状态参数 (1).应用程序必须保存和恢复主窗口的状态参数(位置.大小等) 2.应用程序退出的过程 (1).收到关闭事件 (2).执行关闭事件处理函数 (3).主窗口从 ...
- 第二十九课、主窗口中的状态栏------------------狄泰软件学院
一.主窗口中的状态栏 1.状态栏的概念和意义 (1).状态栏是应用程序中输出简要信息的区域 (2).状态栏一般位于主窗口的最底部 (3).状态栏中的消息类型 A.实时消息:如当前程序状态 B.永久消息 ...
- 7.QT-Qt对象间的父子关系
Qt对象之间可以存在父子关系 继承于QObject类或者其子类的对象,都称为Qt对象 当指定Qt对象的父对象时 需要通过setParent()成员函数来设置对象间的父子关系 子对象将会把自己的指针地址 ...
- JAVA学习第四十六课 — 其它对象API(二)Date类 amp; Calendar类(重点掌握)
Date类(重点) 开发时,会时常遇见时间显示的情况,所以必须熟练Date的应用 <span style="font-family:KaiTi_GB2312;font-size:18p ...
- 第十三课、类族的结构进化-------------------狄泰软件学院
一.遵循经典设计原则 DTLib中的所有类位于单一继承树 IvalidOperationEXception是新增的异常类,描述某些成员函数在状态不对的时候被抛出 二.改进的关键点 1.EXceptio ...
- OpenGL教程翻译 第二十六课 法线纹理
第二十六课 法线纹理 背景 我们之前使用的光照技术还算不错,光线在模型表面得到了很好的插值,为场景营造出真实感.但是这种效果还能够有非常大的提升.事实上,我们以前使用的这种插值方式在某种程度上来说是对 ...
- OpenGL(十六)——Qt OpenGL融合(将两张图片叠合成一张图片)
OpenGL(十六)--Qt OpenGL融合(将两张图片叠合成一张图片) 一.场景 在常用的项目场景中,我们经常会遇到将两个图片合在一起变成一张图片,这时候就会有前后之分,特别是两个物体合在一起的时 ...
- NeHe OpenGL教程 第三十六课:从渲染到纹理
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- NeHe OpenGL第四十六课:全屏反走样
NeHe OpenGL第四十六课:全屏反走样 全屏反走样 当今显卡的强大功能,你几乎什么都不用做,只需要在创建窗口的时候该一个数据.看看吧,驱动程序为你做完了一切. 在图形的绘制中,直线的走样是非 ...
最新文章
- 【干货】CNN与Transformer的强强联合!谷歌最新开源BoTNet,ImageNet达84.7%准确率
- Node中require方法的简单实现
- 2019研究生数学建模比赛题目
- 2015 11月30日 一周工作计划与执行
- 汽车电子专业知识篇(十六)-整车电气系统设计——高压系统框架略读
- css如何实现一个小三角形,用纯css写一个常见的小三角形
- pandas DataFrame数据筛选和切片
- java后台 ajax_ajax提交到java后台之后处理数据的实现
- VS编译器的使用——VS2019新建控制台工程
- 自定义填充图案插件 cad_CAD填充技巧:填充图案
- 使用pyecharts绘制图表
- 医号馆诊所管理软件系统更新,新增人脸识别、处置单等功能!
- 单片机驱动DM9000
- 数商云渠道分销管理系统方案:分销渠道系统趋势、作用、功能、业务场景
- Grid++用程序定义报表模板(官方例子)
- 在PS中如何设计个人logo
- Python利用hadoop Streaming编写的Map-Reduce程序命令运行和本地调试运行
- 古老CPU启示录-意义重大的8008 芯片
- 房价下跌的“理由”越来越多
- 爬虫重试模块retry,自动重试
热门文章
- ue编辑器拖拽上传图片_editor.md实现拖拽剪切复制粘贴上传图片,文件插件
- php任务队列有什么优势,PHP使用任务队列这个词的含义,到底什么是任务队列
- Mysql日期和时间函数大全
- Java:使用Executors创建和管理线程
- linux cut的用法
- HDU-1028 Ignatius and the Princess III(生成函数)
- C# Windows服务相关
- Microsoft SQL Server Version List 版本列表
- Masonry('couldn't find a common superview for)
- 11gOCP 1z0-052 :2013-09-11 MGR_ROLE role........................................................A66