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

相关文章

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

Java对象转换的实现方式汇总

《Java对象转换的实现方式汇总》:本文主要介绍Java对象转换的多种实现方式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Java对象转换的多种实现方式1. 手动映射(Manual Mapping)2. Builder模式3. 工具类辅助映

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

Qt中QGroupBox控件的实现

《Qt中QGroupBox控件的实现》QGroupBox是Qt框架中一个非常有用的控件,它主要用于组织和管理一组相关的控件,本文主要介绍了Qt中QGroupBox控件的实现,具有一定的参考价值,感兴趣... 目录引言一、基本属性二、常用方法2.1 构造函数 2.2 设置标题2.3 设置复选框模式2.4 是否

QT进行CSV文件初始化与读写操作

《QT进行CSV文件初始化与读写操作》这篇文章主要为大家详细介绍了在QT环境中如何进行CSV文件的初始化、写入和读取操作,本文为大家整理了相关的操作的多种方法,希望对大家有所帮助... 目录前言一、CSV文件初始化二、CSV写入三、CSV读取四、QT 逐行读取csv文件五、Qt如何将数据保存成CSV文件前言

Qt中QUndoView控件的具体使用

《Qt中QUndoView控件的具体使用》QUndoView是Qt框架中用于可视化显示QUndoStack内容的控件,本文主要介绍了Qt中QUndoView控件的具体使用,具有一定的参考价值,感兴趣的... 目录引言一、QUndoView 的用途二、工作原理三、 如何与 QUnDOStack 配合使用四、自

Python中判断对象是否为空的方法

《Python中判断对象是否为空的方法》在Python开发中,判断对象是否为“空”是高频操作,但看似简单的需求却暗藏玄机,从None到空容器,从零值到自定义对象的“假值”状态,不同场景下的“空”需要精... 目录一、python中的“空”值体系二、精准判定方法对比三、常见误区解析四、进阶处理技巧五、性能优化

Qt spdlog日志模块的使用详解

《Qtspdlog日志模块的使用详解》在Qt应用程序开发中,良好的日志系统至关重要,本文将介绍如何使用spdlog1.5.0创建满足以下要求的日志系统,感兴趣的朋友一起看看吧... 目录版本摘要例子logmanager.cpp文件main.cpp文件版本spdlog版本:1.5.0采用1.5.0版本主要

在java中如何将inputStream对象转换为File对象(不生成本地文件)

《在java中如何将inputStream对象转换为File对象(不生成本地文件)》:本文主要介绍在java中如何将inputStream对象转换为File对象(不生成本地文件),具有很好的参考价... 目录需求说明问题解决总结需求说明在后端中通过POI生成Excel文件流,将输出流(outputStre

Qt 中 isHidden 和 isVisible 的区别与使用小结

《Qt中isHidden和isVisible的区别与使用小结》Qt中的isHidden()和isVisible()方法都用于查询组件显示或隐藏状态,然而,它们有很大的区别,了解它们对于正确操... 目录1. 基础概念2. 区别清见3. 实际案例4. 注意事项5. 总结1. 基础概念Qt 中的 isHidd