Qt 之对象树与所有权

2024-05-27 19:18
文章标签 qt 对象 所有权

本文主要是介绍Qt 之对象树与所有权,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

作者: 一去、二三里
个人微信号: iwaleon
微信公众号: 高效程序员

QObjects在一个对象树中组织他们自己。当创建一个QObject时,如果使用了其他对象作为其父对象,那么,它就会被添加到父对象的children()列表中。这样一来,当父对象被销毁时,这个QObject也会被销毁。事实表明,这个机制非常适合于管理GUI对象。例如:一个QShortcut(键盘快捷键)对象是相关窗口的一个子对象,所以,当用户关闭了这个窗口时,快捷键也会被销毁。

详细描述

QQuickItem是Qt Quick模块的基本视觉元素,从QObject继承。但有一个不同于QObject parent的visual parent的概念,一个item的visual parent不一定和它的object parent相同。可以参考助手中的Concepts - Visual Parent in Qt Quick获取更多信息。

QWidget是Qt Widgets模块的基本类,扩展了父-子关系。孩子通常成为一个部件,即:它会显示在其父窗体的坐标系统中,并且由其父窗体的边界灵活地进行剪裁。例如:当应用程序在关闭提示框(QMessageBox)之后要删除它时,消息框的按钮和标签也会被删除。这正是我们所期望的,因为按钮和标签是对话框的子部件。

当然,也可以自己删除子对象,他们会从父窗体中移除自己。例如:当用户移除一个工具栏时,它可能会导致应用程序删除QToolBar中的一个对象,在这种情况下,工具栏的QMainWindow父窗体将会检测变化,并重新配置其相应的屏幕空间。

当一个应用程序看上去或执行起来比较奇怪时,调试函数QObject:dumpObjectTree()和QObject::dumpObjectInfo()通常比较有用。

QObjects的构造/销毁顺序

当QObjects被创建在堆上(例如:使用new创建)时,他们可以用任何顺序构造一个树。之后,树中的对象可以用任何顺序被销毁。当树中的任何QObject被删除时,如果它有父对象,析构函数会自动从其父对象中把它删除。如果它有子对象,析构函数会自动删除它的每一个子对象。无论销毁的顺序是什么,QObject都不会被删除两次,

当QObject被创建在栈上时,同样的行为适用。通常情况下,销毁顺序仍然不会出现问题。看下面的代码:

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

父窗口(window)和子部件(quit)都属于QObjects,因为QPushButton继承自QWidget,而QWidget继承自QObject。这段代码是正确的:quit的析构函数不会被调用两次,因为C++语言标准(ISO/IEC 14882:2003)指定本地对象的析构函数以和构造函数相反的顺序被调用。所以,子部件quit的析构函数首先被调用,在window调用析构之前,它已经从其父窗口window中删除自身。

如果我们交换顺序,如下所示:

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

在这种情况下,销毁的顺序会引起一个问题。父窗体的析构函数首先被调用,因为它最后被创建。然后调用子部件(quit)的析构函数,这是不正确的,因为quit是一个局部变量,当出了作用域后,其析构函数再次被调用,因此会出错。

这篇关于Qt 之对象树与所有权的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1008354

相关文章

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

Qt QCustomPlot库简介(最新推荐)

《QtQCustomPlot库简介(最新推荐)》QCustomPlot是一款基于Qt的高性能C++绘图库,专为二维数据可视化设计,它具有轻量级、实时处理百万级数据和多图层支持等特点,适用于科学计算、... 目录核心特性概览核心组件解析1.绘图核心 (QCustomPlot类)2.数据容器 (QCPDataC

Qt如何实现文本编辑器光标高亮技术

《Qt如何实现文本编辑器光标高亮技术》这篇文章主要为大家详细介绍了Qt如何实现文本编辑器光标高亮技术,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录实现代码函数作用概述代码详解 + 注释使用 QTextEdit 的高亮技术(重点)总结用到的关键技术点应用场景举例示例优化建议

Qt 设置软件版本信息的实现

《Qt设置软件版本信息的实现》本文介绍了Qt项目中设置版本信息的三种常用方法,包括.pro文件和version.rc配置、CMakeLists.txt与version.h.in结合,具有一定的参考... 目录在运行程序期间设置版本信息可以参考VS在 QT 中设置软件版本信息的几种方法方法一:通过 .pro

SpringMVC高效获取JavaBean对象指南

《SpringMVC高效获取JavaBean对象指南》SpringMVC通过数据绑定自动将请求参数映射到JavaBean,支持表单、URL及JSON数据,需用@ModelAttribute、@Requ... 目录Spring MVC 获取 JavaBean 对象指南核心机制:数据绑定实现步骤1. 定义 Ja

Python打印对象所有属性和值的方法小结

《Python打印对象所有属性和值的方法小结》在Python开发过程中,调试代码时经常需要查看对象的当前状态,也就是对象的所有属性和对应的值,然而,Python并没有像PHP的print_r那样直接提... 目录python中打印对象所有属性和值的方法实现步骤1. 使用vars()和pprint()2. 使

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA

C#之List集合去重复对象的实现方法

《C#之List集合去重复对象的实现方法》:本文主要介绍C#之List集合去重复对象的实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C# List集合去重复对象方法1、测试数据2、测试数据3、知识点补充总结C# List集合去重复对象方法1、测试数据

Spring中管理bean对象的方式(专业级说明)

《Spring中管理bean对象的方式(专业级说明)》在Spring框架中,Bean的管理是核心功能,主要通过IoC(控制反转)容器实现,下面给大家介绍Spring中管理bean对象的方式,感兴趣的朋... 目录1.Bean的声明与注册1.1 基于XML配置1.2 基于注解(主流方式)1.3 基于Java

C++/类与对象/默认成员函数@构造函数的用法

《C++/类与对象/默认成员函数@构造函数的用法》:本文主要介绍C++/类与对象/默认成员函数@构造函数的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录名词概念默认成员函数构造函数概念函数特征显示构造函数隐式构造函数总结名词概念默认构造函数:不用传参就可以