Qt 父子对象的关系

news2024/11/20 12:30:58

文章目录

  • 前言
      • 一. Qt 对象可以存在父子关系:
      • 二. 父子关系的建立:
      • 三. Qt 对象的销毁:
  • 总结

前言

Qt是一个流行的C++框架,用于开发跨平台的图形用户界面(GUI)应用程序。Qt提供了一种强大的对象模型,其中一个关键概念是对象间的父子关系。


一. Qt 对象可以存在父子关系:

在Qt中,对象间的父子关系是通过 QObject 类和对象树机制来实现的。每个QObject派生类都具有父子关系的能力。通过建立父子关系,可以形成一个层次结构,从而方便进行对象的管理和组织。

父子关系在Qt中有以下几个主要作用:

  1. 对象的内存管理:父对象负责管理其所有子对象的生命周期。当父对象被销毁时,它会自动销毁其所有子对象。这种自动释放内存的机制大大简化了对象资源的管理,减少了内存泄漏的风险。
  2. 信号与槽机制:父子关系对信号与槽机制的使用提供了便利。当一个对象发送信号时,其父对象可以接收并处理该信号。这种机制可以用于在对象之间进行通信和交互。
  3. 对象的查找和访问:通过父子关系,可以方便地查找和访问对象树中的对象。通过QObject的findChild()和findChildren()等函数,可以在对象树中根据对象名称、类型等条件查找对象,实现对象之间的联动和数据传递。

二. 父子关系的建立:

在Qt中建立父子关系很简单。可以通过在构造函数中传递父对象指针来建立对象间的父子关系,或者使用setParent( ) 函数来设置父对象。

示例代码:

QObject* parent = new QObject();	 	// 创建父对象

QObject* child = new QObject(parent); 		// 创建子对象,并指定父对象

Qobject* p = new Qobject( );
Qobject* c1 = new Qobject ();
Q0bject* c2 = new Qobject ( );

c1->setParent (p) ;			// 指定父对象
c2->setParent (p);

Qt提供了几个函数来管理父子关系:

  • setParent ( ) :设置对象的父对象。
  • parent( ) :获取对象的父对象。
  • children( ) :获取对象的直接子对象。
  • findChild( ) 和 findChildren( ) :在对象树中查找对象。

当指定Qt 对象的父对象时:

- 其父对象会在子对象链表中加入该对象的指针
- 该对象会保存指向其父对象的指针

三. Qt 对象的销毁:

当父对象被销毁时,它会自动销毁其所有子对象。这种自动释放内存的机制大大简化了对象资源的管理,减少了内存泄漏的风险。

利用Qt对象间的父子关系可以构成对象树 。删除树中的节点时会导致对应的子树被销毁.

在这里插入图片描述
代码解析:

class My_Object : public QObject
{
    QString m_name;
public:
    My_Object(const QString& name)
    {
        m_name = name;

        qDebug() << "My_Object: " << m_name;
    }

    ~My_Object()
    {
        qDebug() << "~ My_Object: " << m_name;
    }
};

void Test()
{
    My_Object* obj1 = new My_Object("obj1");
    My_Object* obj2 = new My_Object("obj2");
    My_Object* obj3 = new My_Object("obj3");
    My_Object* obj4 = new My_Object("obj4");

    obj2->setParent(obj1);
    obj3->setParent(obj1);
    obj4->setParent(obj3);

    delete obj3;							// 销毁 obj3

    const QObjectList& list = obj1->children();

    qDebug() << "obj2: " << obj2;
//    qDebug() << "obj3: " << obj3;

    for(int i=0; i<list.length(); i++)			// 便利链表
    {
        qDebug() << list[i];
    }

   // delete obj4;							销毁 obj3 后 不可重复销毁 obj4
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    Test();
	return a.exec();
}

销毁 obj3 后 :
链表 里 只有 obj2 的地址。
在这里插入图片描述
未 销毁 obj3 时:
链表 里 有 obj2 和 obj3 的地址。
在这里插入图片描述


总结

Qt对象间的父子关系是一种强大而便捷的机制,用于对象管理、内存释放、信号与槽机制和对象访问。通过建立父子关系,可以形成一个层次结构,简化对象的管理和组织。在使用父子关系时,需要注意对象的生命周期和内存管理,以确保正确且安全地使用这一特性。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

leetcode做题笔记83删除排序链表中的重复元素

给定一个已排序的链表的头 head &#xff0c; 删除所有重复的元素&#xff0c;使每个元素只出现一次 。返回 已排序的链表 。 输入&#xff1a;head [1,1,2] 输出&#xff1a;[1,2] 思路一&#xff1a;模拟题意 struct ListNode* deleteDuplicates(struct ListNode* head){i…

韦东山-电子量产工具项目:显示单元

所有代码都已通过测试跑通&#xff0c;其中代码结构如下&#xff1a; 一、include文件夹 1.1 disp_manager.h #ifndef _DISP_MANAGER_H //防止头文件重复包含,只要右边的出现过&#xff0c;就不会再往下编译 #define _DISP_MANAGER_H //区域结构体 typedef struct DispBuff …

机器学习样本数据划分的典型Python方法

机器学习样本数据划分的典型Python方法 DateAuthorVersionNote2023.08.16Dog TaoV1.0完成文档撰写。 文章目录 机器学习样本数据划分的典型Python方法样本数据的分类Training DataValidation DataTest Data numpy.ndarray类型数据直接划分交叉验证基于KFold基于RepeatedKFold基…

【C++】面向对象编程引入 ( 面向过程编程 | 查看 iostream 依赖 | 面向对象编程 )

文章目录 一、面向过程编程二、查看 iostream 依赖三、面向对象编程 一、面向过程编程 给定 圆 的 半径 , 求该圆 的 周长 和 面积 ; 半径为 r r r , 周长就是 2 π r 2 \pi r 2πr , 面积是 π r 2 \pi r^2 πr2 ; 使用 面向过程 的方法解决上述问题 , 只能是令程序顺序执…

DDCX——运维开发准备

DD——运维开发准备 一4 linux用的什么版本&#xff0c;常见命令&#xff08;awk sed grep telnet netstate tcpdump top ps perf&#xff09;5 数据库有哪些类型&#xff0c;关系型数据库有哪些&#xff0c;非关系型数据库有哪些6 mysql事务7 mysql集群了解多少8 redis数据类型…

Spring 框架入门介绍及IoC的三种注入方式

目录 一、Spring 简介 1. 简介 2. spring 的核心模块 ⭐ 二、IoC 的概念 2.1 IoC 详解 2.2 IoC的好处 2.3 谈谈你对IoC的理解 三、IoC的三种注入方式 3.1 构造方法注入 3.2 setter方法注入 3.3 接口注入&#xff08;自动分配&#xff09; 3.4 spring上下文与tomcat整…

ChatGPT聊天微信小程序源码/适配H5和WEB端

ChatGPT-MP(基于ChatGPT实现的微信小程序&#xff0c;适配H5和WEB端) 可二开包含前后台&#xff0c;支持打字效果输出流式输出&#xff0c;支持AI聊天次数限制&#xff0c;支持分享增加次数等功能。开源版禁止商用&#xff0c;仅供学习交流&#xff0c;禁止倒卖。 技术栈&…

本地linux 搭建云服务器

本人穷逼&#xff0c;三年268 腾讯云可以接受&#xff0c;续费千百块 承担不起 研究了一会&#xff0c;发现搭建云服务器有两种较好的方式 一种是有公网IP的&#xff0c;另外是没有公网IP的&#xff0c;这里实验成功的是没有公网ip的方法 这种方法有缺点&#xff0c;因为fre…

前端组件高级封装技巧--纯干货

对于前端的小伙伴来说&#xff0c;最常见的工作就是写后台管理系统的页面&#xff0c;而后台管理系统最多的操作就是CRUD了&#xff0c;类似下面的&#xff0c;一个搜索框&#xff0c;一个表格&#xff0c;一个分页&#xff0c;然后点击新增编辑有个弹框 当你写过一段时间的CRU…

OpenDDS安装教程 Java开发

一、环境搭建 1、版本介绍 笔者使用以下版本&#xff08;不同版本的openDDS对应ACETAO版本不同&#xff09; openDDS&#xff1a;3.14 ACETAO&#xff1a;6.5.12 perl&#xff1a;5.32.0.1-64bit Visual Studio&#xff1a;Community 2019 jdk&#xff1a;jdk-8u111-windows-…

spark的standalone 分布式搭建

一、环境准备 集群环境hadoop11&#xff0c;hadoop12 &#xff0c;hadoop13 安装 zookeeper 和 HDFS 1、启动zookeeper -- 启动zookeeper(11,12,13都需要启动) xcall.sh zkServer.sh start -- 或者 zk.sh start -- xcall.sh 和zk.sh都是自己写的脚本-- 查看进程 jps -- 有…

【CTF-web】备份是个好习惯(查找备份文件、双写绕过、md5加密绕过)

题目链接&#xff1a;https://ctf.bugku.com/challenges/detail/id/83.html 经过扫描可以找到index.php.bak备份文件&#xff0c;下载下来后打开发现是index.php的原代码&#xff0c;如下图所示。 由代码可知我们要绕过md5加密&#xff0c;两数如果满足科学计数法的形式的话&a…

centos7离线安装gdal3.6.3

本文档以纯离线环境为基础&#xff0c;所有的安装包都是提前下载好的。以gdal3.6.3为例&#xff08;其他版本安装步骤或方式可能不同&#xff09;&#xff0c;在centos7系统离线安装&#xff0c;并运行java项目&#xff0c;实现在java服务中调用gdal库解析地理数据。以下任意组…

python的 __all__ 用法

一、介绍 在Python中&#xff0c;__all__通常用于定义模块的公开接口。在使用from module import *语句时&#xff0c;此时被导入模块若定义了__all__属性&#xff0c;则只有__all__内指定的属性、方法、类可被导入&#xff1b;若没定义&#xff0c;则导入模块内的所有公有属性…

华为公开“倒装芯片封装”创新技术,改善散热性能,火龙秒变冰龙

根据华为技术有限公司公开的专利申请&#xff0c;他们提出了一项名为“具有改进的热性能的倒装芯片封装”的创新技术。这项技术旨在改善各种专利应用设备的散热性能&#xff0c;涉及的芯片类型包括CPU、GPU、FPGA和ASIC等。 这些设备可以是智能手机、平板电脑、可穿戴移动设备、…

CUDA计算超时(TDR)和阻塞界面问题的处理参考方法

本文提供一种解决单个英伟达独立显卡(终端用户常见的情形)上计算密集导致程序崩溃和电脑界面卡死的问题参考方法,采取降低效率和花费更多时间的思路来解决崩溃和卡顿的问题,即让CPU占有率不是一直100%,也不会因为被TDR机制打断。 如上图,在GPU-Z软件中看到“GPU Load”没…

实施统一待办:如何将“人找事变成事找人”

当企业信息化发展到一定程度&#xff0c;往往会呈现一种局面&#xff1a;专业的咖&#xff0c;管专业的事。如HRM管企业的人事信息、SRM管企业与供应商之间的合作关系、CRM管企业与客户之间的互动和沟通等。 然而当这些系统叠加在一起时&#xff0c;奇妙的化学反应产生了&#…

C#工程建立后修改工程文件名与命名空间

使用之前的项目做二次开发&#xff0c;项目快结束的时候&#xff0c;需要把主项目的名称修改成我们想要的。 之前从来没有这么干过&#xff0c;记录一下。 步骤如下&#xff1a; 1&#xff1a;打开vs2010项目解决方案&#xff0c;重命名&#xff0c;如下图所示&#xff1a; …

stack 、 queue的语法使用及底层实现以及deque的介绍【C++】

文章目录 stack的使用queue的使用适配器queue的模拟实现stack的模拟实现deque stack的使用 stack是一种容器适配器&#xff0c;具有后进先出&#xff0c;只能从容器的一端进行元素的插入与提取操作 #include <iostream> #include <vector> #include <stack&g…

猿人学刷题系列(第一届比赛)——第三题

题目&#xff1a;抓取下列5页商标的数据&#xff0c;并将出现频率最高的申请号填入答案中 地址&#xff1a;https://match.yuanrenxue.cn/match/3 本题主要考察请求逻辑&#xff0c;可以借助fiddler或Charles等抓包工具进行分析。首先通过浏览器来简单进行请求逻辑分析。 从抓…