Qt对象树和QObject的构建/销毁顺序

2023-11-09

Qt使用对象树组织QObject

当以一个对象作为父对象创建QObject时,这个对象就会被添加到父对象的children()列表中,当父对象被delete时该对象也会被释放。

在析构一个对象obj时,会进行两个操作:

  • 如果它有parent,它会从它的parent中移除。
  • 如果它有children,它的所有children会自动delete。

记住,QT主要用来开发图形用户界面程序。这种对象的组织方法非常适合GUI对象的需求,

例如,QShortcut(键盘快捷方式)是相关窗口的子级,当用户关闭该窗口时,该快捷键也会被删除。

不仅如此,QWidget作为Qt Widgets模块的基本类(所有用户界面对象的基类),它还扩展了QObject的父子关系。
一个QWidget的子级成为了子级小部件,它在其父级的坐标系中显示,并根据其父级的边界以图形方式进行裁剪

例如,当应用程序在关闭后删除消息框时,消息框的按钮和标签也会被删除,因为按钮和标签是消息框的子级。

QObject的构建/销毁顺序

根据对象创建方式需要分为两种情况来讨论:

1.在堆上创建(使用new创建)

当在堆上创建QObject时(即用new创建),可以以任何顺序创建对象、构造对象树。也可以以任何顺序销毁树中的对象。

2.在栈上创建

在栈上创建QObject时,通常销毁顺序仍然不会出现问题。
看下面这个例子:

int main()
{
    QWidget window;
    QPushButton quit("Quit", &window);
    ...
}

quitwindow的子对象。根据C++语言标准,以与构造函数相反的顺序调用本地对象的析构函数,那么在程序结束时,quit的析构函数将会先被调用,它将自己从其父对象中移除。随后,window的析构函数被调用,由于quit已从window的children中移除,quit的析构函数不会被调用两次。销毁正常。


需要注意的是这种情况:

int main()
{
    QPushButton quit("Quit");
    QWidget window;

    quit.setParent(&window);
    ...
}

根据创建顺序,window会先被析构,它也将调用它的所有children的析构函数,即quit的析构函数会在此时被调用。随后,quit这个局部变量的析构函数会再一次被调用,也就是说quit的析构函数调用了两次。
在这种情况下,销毁顺序出现了问题。因此,在编码时需要注意对象的创建顺序,最好按照父先子后的顺序进行创建。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt对象树和QObject的构建/销毁顺序 的相关文章

随机推荐

  • 3DMax 不断崩溃,常见的5种处理方案!

    Autodesk 3DS Max 是一种流行的 3D 建模和动画软件 被图形设计和游戏行业的许多专业人士使用 但是 与任何其他软件一样 用户会遇到崩溃问题 本文列出了 5种常见的解决方案 用于排除故障并解决 3DS Max 崩溃问题 Aut
  • Mysql 的 聚簇索引和二级索引

    原文地址 聚簇索引和二级索引 增加部分补充和理解 目录 1 索引的简述 1 聚簇索引 2 非聚簇索引 二级索引 辅助索引 2 示例 聚簇索引 主键索引 二级索引 辅助索引 3 结论 结论一 结论二 写在前面 针对原博主的讲述 网友提出相应补
  • 【算法】骑士周游 ---递归的说明

    因为说明中没有对应具体代码 请先看最下方代码在看说明 普通递归 创建一个二维空表做棋盘 用step记录走过的步数 用来增加条件判断游戏是否成功 棋盘上记录步数 使用visted记录是否该点是否走过 一张一维标记对应二位棋盘是否已走过 递归的
  • ElasticSearch RestHighLevelClient 教程(三) 删除&&查

    版权声明 本文为博主原创文章 遵循 CC 4 0 BY SA 版权协议 转载请附上原文出处链接和本声明 本文链接 https blog csdn net paditang article details 79172837 前言 删除文档作为
  • C语言在字符串中删除特定字符

    当出现特定字符的位置用一个新定义的字符串进行类似跳过特定字符的操作 输入 s 输出 adlfjaljgowea include include void delSpace char s char c int main char str 80
  • xss跨站之代码及http only绕过

    什么是http only 在cookie中设置了http only属性 那么通过js代码无法获取cookie 并不能防止xss漏洞 在上一节的靶场网站源代码里面 写上这一串代码就是启动http only 再加上带去cookie的代码 然后我
  • Hibernate工作原理(图解)

    在 Hibernate操作数据库一节的学习中 我们主要涉及到了 Configuration SessionFactory Session Transaction 和 Query 等多个接口 这些接口在 Hibernate 运行时都扮演着十分
  • 货币银行学入门知识

    用IT技术玩金融系列文章 将介绍如何使用IT技术 处理金融大数据 在互联网混迹多年 已经熟练掌握一些IT技术 单纯地在互联网做开发 总觉得使劲的方式不对 要想靠技术养活自己 就要把技术变现 通过 跨界 可以寻找新的机会 创造技术的壁垒 金融
  • ncl泰勒图(均方根误差、标准差、相关系数)

    最近学习了一下泰勒图的做法 对2001年泰勒的文章进行了简单学习 说一点自己的理解 泰勒图一般是用来评估多个模式对观测数据的模拟能力 包括标准差 中心型均方根误差 相关系数这三部分 这三部分可以构建一个三角关系 相关系数是用来量化模式之间的
  • SQLyog安装教程详解

    安装SQLyog的详细步骤 1 复制连接 https pan baidu com s 19DHHrCqvg 0 StazHqGhcg 提取码 1111 2 等待下载 3 解压到新建文件夹 4 点击解压后的X64 右键 以管理员的身份运行 5
  • WEB前端网页设计-Bootstrap5 提示框 & JavaScript 对象

    目录 Bootstrap5 提示框 如何创建提示框 指定提示框的位置 JavaScript 对象 真实生活中的对象 属性和方法 JavaScript 对象 对象定义 实例 实例 对象属性 访问对象属性 实例 1 实例 2 对象方法 实例 实
  • PostgreSQL一些常用命令

    最近一直在学习Postgresql 下面是自己整理的Postgresql的常用命令 连接数据库 默认的用户和数据库是postgres psql U user d dbname 切换数据库 相当于mysql的use dbname c dbna
  • shuffleNet V2

    论文出发点 旨在设计一个轻量级但是保证精度 速度的深度网络 分析当前 1 直接用FLOP来衡量算力 不够准确 因为不同的网路 即使参数量相同 模型大小相同 但是模型速度还是存在差异 改为直接用速度 speed 来衡量 2 直接影响速度的因素
  • 最小二乘法的实现与线性回归的应用

    1 简介 简单线性回归中 您有一个因变量y和一个自变量X 该模型可以表示为 y m x b y mx b y
  • CTF-pwn入门–基础环境安装

    pwn的入门 环境安装 虚拟机安装 Linux ubuntu PWN的题大多数是在Linux上打 先安装一个Ubuntu是成为pwn手的开始 VMware Workstation Pro VMware Workstation Pro官网 U
  • 运行tomcat报错:Address localhost:1099 is already in use

    文章目录 1 报错展示 2 报错原因 3 解决方法 1 报错展示 报错语句 Address localhost 1099 is already in use 表示是1099端口已经被占用 2 报错原因 由于短时间内频繁运行tomcat服务器
  • 计算一个整数N的阶乘

    计算一个整数N的阶乘 时间限制 1Sec 内存限制 128MB 提交 1149 解决 775 题目描述 计算一个整数N的阶乘 输入 一个整数N 0 N 12 输出 整数N的阶乘 样例输入 5 样例输出 120 这是一道简单的c语言练习题 采
  • Linux安装Kafka

    相关链接 http kafka apache org downloads 1 使用Docker安装zookeeper 下载镜像 docker pull zookeeper 3 4 14 创建容器 docker run name zookee
  • python获取当前时间时分秒_python获取当前时间的用法

    1 先导入库 import datetime 2 获取当前日期和时间 now time datetime datetime now 3 格式化成我们想要的日期 strftime 比如 2016 09 21 datetime datetime
  • Qt对象树和QObject的构建/销毁顺序

    文章目录 Qt使用对象树组织QObject QObject的构建 销毁顺序 1 在堆上创建 使用new创建 2 在栈上创建 Qt使用对象树组织QObject 当以一个对象作为父对象创建QObject时 这个对象就会被添加到父对象的child