【Qt开发流程】之对象模型3:对象树及其所有权

描述

Qt对象树是一种基于父子关系的对象管理机制,用于管理Qt应用程序中的所有对象。在Qt中,每个对象都可以拥有一个或多个子对象,并且每个子对象只能属于一个父对象。每个对象的所有权(也称为生存期)由其父对象控制。当父对象销毁时,它们会自动销毁其所有子对象,以确保在程序结束之前释放所有内存。
对象在对象树中组织自己。当you使用另一个对象作为父对象创建QObject时,它被添加到父对象的children()列表中,并在父对象被删除时被删除。事实证明,这种方法非常适合GUI对象的需要。例如,QShortcut(键盘快捷键)是相关窗口的子窗口,因此当用户关闭该窗口时,快捷键也会被删除。
QWidgetQt Widgets模块的基本类,它扩展了父子关系。子部件通常也成为子部件,即它显示在其父部件的坐标系统中,并被其父部件的边界以图形方式剪切。例如,当应用程序在关闭消息框后删除消息框时,消息框的按钮和标签也会被删除,正如我们所希望的那样,因为按钮和标签是消息框的子框。
程序员也可以自己删除子对象,将自己从父对象中移除。例如,当用户删除工具栏时,可能导致应用程序删除其QToolBar对象之一,在这种情况下,工具栏的QMainWindow父组件将检测到更改并相应地重新配置其屏幕空间。
调试函数QObject:: dumpobjectreree()QObject::dumpObjectInfo()在应用程序看起来或行为异常时通常很有用。
QObject:: dumpobjectreree():

this->dumpObjectTree();

在这里插入图片描述
QObject::dumpObjectInfo():

checkBox->dumpObjectInfo();

在这里插入图片描述

实际应用

在实际应用中,可以通过以下几种方式创建对象树:

  1. 通过new运算符手动分配内存来创建对象,然后使用QObject的setParent()函数将它们移动到树中。

  2. 使用Qt的自动内存管理机制,例如Qt的容器类,这些类在使用时会自动管理对象的内存,使它们成为树中的子对象。

对象的构造和销毁顺序

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

当在堆栈上创建QObjects时,同样的行为也适用。通常情况下,破坏的顺序不会造成问题。如下面的代码片段:

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

父窗口和子窗口都是QObject,因为QPushButton继承了QWidget,而QWidget继承了QObject。这段代码是正确的:quit的析构函数不会被调用两次,因为c++语言标准(ISO/IEC 14882:2003)指定局部对象的析构函数以与其构造函数相反的顺序调用。因此,首先调用子进程的析构函数quit,并在调用window的析构函数之前将自己从父进程window中移除。

但是现在考虑一下如果我们交换构造顺序会发生什么,如下面代码所示:

    QPushButton quit("Quit");
    QWidget window;

    quit.setParent(&window);

在这种情况下,破坏的顺序会引起问题。父类的析构函数首先被调用,因为它是最后创建的。然后调用它的子孩子quit的析构函数,这是不正确的,因为quit是一个局部变量。当quit随后超出作用域时,它的析构函数将被再次调用,这次是正确的,但是损害已经造成了。

示例

#include <QtWidgets>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    
    QWidget *mainWidget = new QWidget; // 创建主窗口 Widget
    QVBoxLayout *layout = new QVBoxLayout(mainWidget); // 创建主窗口的布局管理器
        
    QLabel *label = new QLabel("Hello Qt!"); // 创建标签对象
    layout->addWidget(label); // 将标签对象添加到布局管理器中

    QPushButton *button = new QPushButton("Click me!"); // 创建按钮对象
    layout->addWidget(button); // 将按钮对象添加到布局管理器中

    mainWidget->show(); // 显示主窗口
    
    return app.exec(); // 进入 Qt 事件循环
}

如果希望将标签和按钮对象添加到主窗口的对象树中,可以使用QWidget的setParent()函数将它们添加为主窗口的子对象:

label->setParent(mainWidget);
button->setParent(mainWidget);

这样,当主窗口对象被销毁时,它们也会被自动销毁。

结论

努力不一定有收获,但是不努力一定会很舒服哦

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/223736.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux常用指令详解

目录 前言&#xff1a; Linux的目录结构 Linux常用指令简介 whoami指令 ls指令 pwd指令 cd指令 tree指令 touch指令 mkdir指令 rmdir指令与rm指令 man指令 cp&#xff08;copy&#xff09;指令 mv&#xff08;move&#xff09;指令 cat指令 重定向及重定向的类型…

SE考研真题总结(一)

本帖开始分享考研真题中设计【软件工程】的部分&#xff0c;预计会出5期左右&#xff0c;敬请期待~ 一.单选题 1.程序编写不是软件质量保障过程~ 静态代码扫描是今年来多数被人提及的软件应用安全解决方案之一&#xff0c;指程序员在编写好代码后无需进行编译&#xff0c;直接…

【网络】抓包工具Wireshark下载安装和基本使用教程

&#x1f341; 博主 "开着拖拉机回家"带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——&#x1f390;开着拖拉机回家_Linux,大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341; 希望本文能够给您带来一定的帮助&#x1…

电商运营基础(一、新手起店完整的运营流程)

任何东西的学习都要现有广度再有深度 一、学习流程大纲 二、新店运营的完整步骤 1.品类选择&#xff08;最重要的一步&#xff09; 切记&#xff0c;电商&#xff0c;选择大于努力 类——类目——做一件代发的——选类目很重要 品——货源——有自己的货源——选品——你做…

行业研究:2023年中国游戏陪玩行业市场现状分析

近年来随着我国游戏行业的不断发展&#xff0c;我国游戏用户规模也是随着稳步上升&#xff0c;给游戏陪玩行业带来了稳定的用户基础。在用户规模增长的同时&#xff0c;随着经济、文化的快速发展&#xff0c;我国娱乐技能社交也随之逐渐兴起。而作为我国娱乐技能社交比重较大的…

HarmonyOS 修改App的默认加载的界面(ArkTS版本)(十七)

根据鸿蒙系统APP的应用生命周期结构&#xff08;鸿蒙4.0开发笔记之ArkTS语法基础之应用生命周期&#xff09;来看。 1、首先在roject/entry/src/main/ets/entryability/EntryAbility.ts文件中找到UI加载函数&#xff1a;onWindowStageCreate(…){…}&#xff0c;然后找到windo…

【i.MX6ULL】linux驱动bh1750模块

I2C-BH1750 1、设备地址 引脚说明 VCC5VGNDGNDSCLPB6SDAPB7ADDRVCC/GND bh1750设备的地址由引脚 ADDR 来决定 ADDR接GND 当ADDR引脚接地时设备bh1750的地址为&#xff1a;0x23(7bit) ADDR接VCC 当ADDR引脚接地时设备bh1750的地址为&#xff1a;0x5c(7bit) 2、工作模式 …

【S32K3环境搭建】-0.3-S32DS安装实时驱动RTD(Real-Time Driver)

目录 1 什么是“实时驱动RTD(Real-Time Driver)” 2 安装“实时驱动RTD(Real-Time Driver)” 2.1 方法一&#xff1a;通过S32DS Extensions and Updates安装“实时驱动RTD(Real-Time Driver)” 2.2 方法二&#xff1a;通过Install New Software…安装“实时驱动RTD(Real-Ti…

基于KSZ9897VLAN 虚拟WAN网络接口

目录 1:先看看高通的8327是如何虚拟网络接口 2: Linux 内核中选上802.1Q 3: 实际效果展示 4&#xff1a;配置使用 1:先看看高通的8327是如何虚拟网络接口 rootOpenWrt:~# cat /etc/config/wirelessconfig wifi-device wifi0option type qcawifioption macaddr 68:89:75:04:…

一篇文章带你详细了解C++智能指针

一篇文章带你详细了解C智能指针 为什么要有智能指针内存泄漏1.什么是内存泄漏&#xff0c;它的危害是什么2.内存泄漏的分类3.如何避免内存泄漏 智能指针的使用及原理1.RAII2.智能指针的原理3.auto_ptr4.unique_ptr5.shared_ptr6.weak_ptr 为什么要有智能指针 C引入智能指针的主…

flink源码分析之功能组件(四)-slot管理组件I

简介 本系列是flink源码分析的第二个系列&#xff0c;上一个《flink源码分析之集群与资源》分析集群与资源&#xff0c;本系列分析功能组件&#xff0c;kubeclient&#xff0c;rpc&#xff0c;心跳&#xff0c;高可用&#xff0c;slotpool&#xff0c;rest&#xff0c;metrics&…

从零开发短视频电商 Jmeter压测示例模板详解(无认证场景)

文章目录 添加线程组添加定时器添加HTTP请求默认值添加HTTP头管理添加HTTP请求添加结果断言响应断言 Response AssertionJSON断言 JSON Assertion持续时间断言 Duration Assertion 添加察看结果树添加聚合报告添加表格察看结果参考 以压测百度搜索为例 https://www.baidu.com/s…

[NAND Flash 2.2] NAND闪存及控制器的市场趋势 [2023]

依公知及经验整理&#xff0c;原创保护&#xff0c;禁止转载。 专栏 《深入理解NAND Flash》 <<<< 返回总目录 <<<< 一、NAND闪存市场分析 据欧洲知名半导体分析机构Yole发布的报告显示&#xff0c;2020年起&#xff0c;NAND闪存市场发展趋势保持稳定…

【Angular开发】Angular中的高级组件

在这个博客中&#xff0c;我将解释Angular中的几个高级组件和机制&#xff0c;它们增强了灵活性、可重用性和性能。 通过熟悉这些高级组件和机制&#xff0c;您可以提高您的Angular开发技能&#xff0c;并在应用程序中利用灵活性、可重用性和性能优化的能力。让我们开始吧&…

使用dockerfile 构建自己的nacos-mysql

前言 在部署nacos的时候触发的脑袋灵光一闪&#xff0c;每次部署nacos都要部署下mysql服务器&#xff0c;然后导入sql语句&#xff0c;配置nacos配置文件&#xff0c;那有没有简单的方法实现一键部署nacos和nacos-mysql 呢? 答案是肯定&#xff01;如下目录图&#xff1a; …

ctfhub技能树_web_信息泄露

目录 二、信息泄露 2.1、目录遍历 2.2、Phpinfo 2.3、备份文件下载 2.3.1、网站源码 2.3.2、bak文件 2.3.3、vim缓存 2.3.4、.DS_Store 2.4、Git泄露 2.4.1、log 2.4.2、stash 2.4.3、index 2.5、SVN泄露 2.6、HG泄露 二、信息泄露 2.1、目录遍历 注&#xff1…

寻找峰值00

题目链接 寻找峰值 题目描述 注意点 数组可能包含多个峰值&#xff0c;在这种情况下&#xff0c;返回 任何一个峰值 所在位置即可对于所有有效的 i 都有 nums[i] ! nums[i 1]可以假设 nums[-1] nums[n] -∞ 解答思路 可以根据二分查找保证在O(log n)的时间复杂度找到峰…

数据中心的操作系统——kubernets

操作系统的功能和模块与 Kubernetes 的功能和模块做了一个对比&#xff1a; Kubernetes 作为数据中心的操作系统还是主要管理数据中心里面的四种硬件资源&#xff1a;CPU、内存、存储、网络。 对于 CPU 和内存这两种计算资源的管理&#xff0c;我们可以通过 Docker 技术完成。…

【数据分享】11个城市的出租车(网约车)数据(免费获取)

出租车&#xff08;网约车&#xff09;GPS数据是我们最常使用的交通大数据之一&#xff0c;但是出租车&#xff08;网约车&#xff09;GPS数据没有公开的获取渠道&#xff0c;有些学者可能能通过与相关机构合作拿到数据&#xff0c;但是对于绝大多数普通人是没有这个机会的&…

跳水比赛(C++)

系列文章目录 进阶的卡莎C++_睡觉觉觉得的博客-CSDN博客数1的个数_睡觉觉觉得的博客-CSDN博客双精度浮点数的输入输出_睡觉觉觉得的博客-CSDN博客足球联赛积分_睡觉觉觉得的博客-CSDN博客大减价(一级)_睡觉觉觉得的博客-CSDN博客小写字母的判断_睡觉觉觉得的博客-CSDN博客纸币(…
最新文章