c++实现Qt对象树机制

news/2025/2/21 19:28:44/

文章目录

  • 对象树是什么
  • 使用对象树的好处
  • 使用c++实现对象树

对象树是什么

 我们常常听到 QObject 会用对象树来组织管理自己,那什么是对象树?
 这个概念非常好理解。因为 QObject 类就有一个私有变量 QList<QObject *>,专门存储这个类的子孙后代们。比如创建一个 QObject 并指定父对象时,就会把自己加入到父对象的 childre() 列表中,也就是 QList<QObject *> 变量中。

使用对象树的好处

 好处就是:当父对象被析构时子对象也会被析构。
 举个例子,有一个窗口 Window,里面有 Label标签、TextEdit文本输入框、Button按钮这三个元素,并且都设置 Window 为它们的父对象。这时候我做了一个关闭窗口的操作,作为程序员的你是不是自然想到将所有和窗口相关的对象析构啊?古老的办法就是一个个手动 delete 呗。是不是很麻烦?Qt 运用对象树模式,当父对象被析构时,子对象自动就 delete 掉了,不用再写一大堆的代码了。
 所以,对象树在 GUI 编程中是非常非常有用的。

使用c++实现对象树

 我们知道Qt对象在创建的时候都可以指定一个父指针,Qt就是通过这个操作将子对象添加到父对象的容器中进行管理,当父对象析构的时候就会遍历这个容器对子对象进行析构,这样子的话用户就不需要自己进行析构子对象。


#include <iostream>
#include <list>
using namespace std;
class Object;
typedef list<Object *> ObjectList;class Object
{
public:ObjectList children_list;Object(Object *parent = nullptr){if(parent){parent->children_list.push_back(this);}}virtual ~Object(){for(auto it = children_list.begin();it != children_list.end();it++){delete *it;}}
};class A:public Object
{
public:A(Object *parent):Object(parent){cout<<"A的构造函数被执行了"<<endl;}~A(){cout<<"A的析构函数被执行了"<<endl;}
};class B:public Object
{
public:B(Object *parent):Object(parent){cout<<"B的构造函数被执行了"<<endl;}~B(){cout<<"B的析构函数被执行了"<<endl;}
};int main()
{Object obj;A *a = new A(&obj);return 0;
}

在这里插入图片描述
当obj对象析构后,a对象不需要进行delete就可以自动进行析构。


http://www.ppmy.cn/news/1009656.html

相关文章

Java实现开发验证码

Java实现开发验证码 需求分析代码实现小结Time 需求分析 分析一下&#xff0c;需求是要我们开发一个程序&#xff0c;生成指定位数的验证码。考虑到实际工作中生成验证码的功能很多地方都会用到&#xff0c;为了提高代码的复用性&#xff0c;我们还是把生成验证码的功能写成方法…

OLED显示原理7T1C

文章目录 背景概念典型显示屏幕OLED与LCD对比----OLED更薄 PPI更高 但寿命低TFT---Thin Film Transistor薄膜场效应晶体管典型TFT材料----a-Si非晶硅、LTPS低温多晶硅、IGZO铟镓锌氧化物LTPO低温多晶氧化物----LTPS和IGZO组合使用的混合产物 OLED屏幕发光关键结构分析单个像素如…

初识性能测试

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;JavaEE &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 目录 什么是性能测试&#xff1f;为什么要做性能测试&#xff1f;性能测试常见术语及性能测试衡量指标并发用户数响应时间/平均响应…

APP后端选择什么服务器

对于很多刚入行的朋友来说&#xff0c;不清楚应该选择什么样的服务器提供商&#xff0c;是选择传统的IDC, 租用服务器租用机柜&#xff0c;还是选择现在很火的云服务器呢&#xff1f;在本文中&#xff0c;通过对比传统的IDC和云服务&#xff0c;简单阐述一下服务器的选择。  …

乐鑫科技 2022 笔试面试题

岗位:嵌入式软件实习生。 个人情况:本科双非电子信息工程,硕士华五软件工程研一在读;本科做过一些很水的项目 ,也拿项目搞了一些奖,相对来说嵌入式方向比较对口。 时间线及面试流程 2021.04.02 笔试 题目分为选择题和编程题,选择题二十题,编程题两题; 选择题基本…

QT学习之QLabel

设置文本 mylbl->setText("Hello QT! Hello QT!"); 根据文本动态调整大小 mylbl->adjustSize(); 位置居中展示&#xff1a;利用横向布局和spacer控件 效果如下&#xff1a;

基于RASC的keil电子时钟制作(瑞萨RA)(7)----配置RTC时钟及显示时间

基于RASC的keil电子时钟制作7_配置RTC时钟及显示时间 概述硬件准备视频教程RTC配置RTC属性配置设定时间设定周期性中断设定日历闹钟时间回调函数演示效果数码管显示日期主程序 概述 本文将详细讲解如何借助e2studio来对瑞萨微控制器进行实时时钟&#xff08;RTC&#xff09;的…

Maven-生命周期

关于本文 ✍写作原因 之前在学校学习的时候&#xff0c;编写代码使用的项目都是单体架构&#xff0c;导入开源框架依赖时只需要在pom.xml里面添加依赖&#xff0c;点一下reload按钮即可解决大部分需求&#xff1b;但是在公司使用了dubbo微服务架构之后发现只知道使用reload不足…