当前位置: 首页 > news >正文

初识Qt:从Hello world到对象树的深度解析

Qt中的对象树深度解析

  • Hello world
    • 1.图形化界面创建
    • 命令行式创建
      • 在栈上创建
      • 在堆上创建
        • 为什么传文本需要QString,std::string不行吗?
        • 那为什么要传入this指针?为什么new后不用显示调用delete函数呢,不会造成内存泄漏问题吗?
  • 一、对象树的基本概念
  • 二、对象树的创建
    • 验证对象树的内存管理
  • 三、对象树的用途
  • 四、对象树的注意事项

Hello world

1.图形化界面创建

在这里插入图片描述
在这里插入图片描述
与上述图片中的树形结构对应,则XML代码为在这里插入图片描述

命令行式创建

在栈上创建

    //构建QLabel标签QLabel label1;label1.setText(QString("Hello World"));

这里我们采用在栈上创建Label对象,并设置其文本为Hello world,但是为什么在对话框没有显示呢?
在这里插入图片描述

局部变量:label1是一个局部变量,它在构造函数结束时会被销毁。即使您将其添加到了布局中,由于它在构造函数结束后不再存在,所以标签也不会显示出来。

在堆上创建

    //构建QLabel标签QLabel* label1=new QLabel(this);label1->setText(QString("Hello World"));

在这里插入图片描述
在这里插入图片描述

通过上述我们发现,现在可以显示在对话框了,但是也存在上述几个问题——

为什么传文本需要QString,std::string不行吗?

在Qt中,QString是Qt框架提供的字符串类,它与C++标准库中的std::string有所不同。尽管在某些情况下,你可以使用std::string,但在Qt应用程序中,通常建议使用QString,因为它具有以下优势:

  1. 跨平台性:QString是Qt框架的一部分,而且是跨平台的。这意味着你可以在不同的操作系统上(如Windows、Linux、macOS等)使用相同的代码,并且QString的行为将是一致的。相比之下,std::string是C++标准库的一部分,可能在不同的编译器或操作系统上有不同的实现和行为。

  2. Unicode支持:QString天生支持Unicode字符集,这意味着它可以轻松处理各种语言和特殊字符,而不会出现乱码或截断等问题。与之相比,std::string在处理Unicode字符时可能会面临一些挑战,需要谨慎处理。

  3. 方便的API:QString提供了丰富的API,可以方便地进行字符串操作,如拼接、查找、替换、大小写转换等。此外,QString还支持使用arg()方法进行字符串格式化,使得字符串处理更加灵活和便捷。

  4. 与Qt框架的集成:QString与Qt框架的其他部分无缝集成,如信号槽机制、国际化支持等。使用QString可以更容易地与其他Qt类进行交互,并且可以利用Qt提供的丰富功能来进行字符串处理。

所以,尽管string也可以作为参数传入,但是为了防止出现乱码(编码不一致)的问题,还是老实用QString传入较好(不用显示写入,通过构造函数,上述 label1->setText("Hello World");也是可以的)

那为什么要传入this指针?为什么new后不用显示调用delete函数呢,不会造成内存泄漏问题吗?

在Qt中,使用this作为父对象参数来创建对象,是为了将新创建的对象添加到当前对象的子对象列表中,并且在当前对象销毁时,这些子对象也会被自动销毁。在示例代码中,通过new QLabel(this)语句创建了一个QLabel对象,并将当前Widget对象作为其父对象

现在来解释一下为什么要传递this:

  1. 对象树管理:Qt中的对象树是通过父子关系来管理的,每个QObject都可以有一个父对象。当一个对象拥有父对象时,它就成为父对象的子对象,而且其生命周期也受父对象管理。通过将this作为父对象参数传递给new QLabel(),你告诉Qt将新创建的QLabel对象添加到当前Widget对象的子对象列表中。

  2. 内存管理:传递this作为父对象参数可以确保在当前Widget对象被销毁时,其所有子对象也会被自动销毁。这是因为Qt会自动管理父对象与其子对象之间的关系,并在父对象销毁时递归地销毁其所有子对象,从而避免内存泄漏。

因此,通过将this作为父对象参数传递给new QLabel(),可以实现对象之间的正确管理和内存自动释放。

那么肯定会疑惑,Qt真的能安全地将我们构造的对象释放吗?你怎么知道?

引入对象树

在Qt这个强大的跨平台C++图形用户界面应用程序开发框架中,对象树是一个核心概念。它不仅为Qt应用程序的内存管理提供了便利,还确保了Qt对象之间的父子关系清晰、易于理解。本文将深入解析Qt中的对象树机制,帮助读者更好地理解其在Qt应用程序中的作用。

一、对象树的基本概念

Qt中的对象树是一个树形结构,其中每个节点都是一个QObject或其派生类的实例。这些对象通过父子关系连接在一起,形成了一个层次结构。在这个结构中,每个对象都可以有一个父对象(除了根对象外),并且可以有多个子对象。
如下图所示为一颗Qt的n叉树,树的根节点为QObject
在这里插入图片描述

二、对象树的创建

在Qt中,对象的创建通常伴随着父子关系的建立。当一个QObject对象在创建时指定了一个父对象,那么这个新创建的对象就会自动添加到父对象的子对象列表中。同时,父对象会接管其所有子对象的内存管理。这意味着,当父对象被删除时,其所有子对象也会被自动删除,从而避免了内存泄漏的问题。

验证对象树的内存管理

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

tips: .h 与 .cpp之间可以通过F4快速切换

在这里插入图片描述
完成创建后编译代码,发现出现了和上述一样的结果
在这里插入图片描述
当我们关闭对话框时,则会发现其默认调用了析构函数

在这里插入图片描述

tips:调⽤析构函数和释放内存并⾮是同⼀件事情.

因此验证了对象树内存管理的机制

三、对象树的用途

  1. 内存管理:如前所述,对象树为Qt应用程序提供了自动的内存管理机制。这种机制通过父子关系来确保当一个对象不再需要时,它的所有子对象也会被正确地删除。
  2. 事件传播:在Qt中,事件(如鼠标点击、键盘输入等)是通过事件系统来传播的。当一个事件发生时,它首先被发送到接收该事件的对象。如果该对象无法处理该事件,那么事件就会沿着对象树向上传播,直到找到一个能够处理该事件的对象为止。这种机制使得Qt能够轻松地处理复杂的事件传递逻辑。
  3. 资源共享:在Qt中,一些资源(如字体、颜色等)可以在对象树中进行共享。当一个对象设置了某个资源时,它的所有子对象都可以访问和使用这个资源。这种机制减少了资源的使用量,提高了应用程序的性能。

四、对象树的注意事项

  1. 避免循环引用:循环引用是指两个或多个对象相互引用,形成一个环路。在构建对象树时,要注意避免循环引用的问题。即一个对象不能成为自己的祖先对象的子对象,否则会导致内存泄漏和其他问题。
// 错误示例:创建循环引用的对象树
QObject *parent = new QObject;
QObject *child = new QObject(parent);
parent->setParent(child); // 这里会导致循环引用// 正确示例:避免循环引用
QObject *parent = new QObject;
QObject *child = new QObject(parent); // 正确,child 是 parent 的子对象
  1. 谨慎使用setParent()方法:setParent()方法用于在运行时更改对象的父对象。但是,需要谨慎使用,因为它可能会导致一些意想不到的问题,例如事件传播错误或资源共享问题。在使用setParent()方法时,需要确保不会破坏对象之间的逻辑关系或导致不一致的状态。
// 示例:谨慎使用 setParent() 方法
QObject *parent = new QObject;
QObject *child = new QObject;// 设置 child 的父对象为 parent
child->setParent(parent);// 如果后续不再需要 parent,要特别小心
delete parent; // 这可能会导致 child 悬空指针,引发错误
  1. 注意对象的生命周期:虽然对象树提供了自动的内存管理机制,但是开发者仍然需要注意对象的生命周期。在不再需要某个对象时,最好显式地删除它(而不是仅仅断开它与父对象的连接),以确保资源的及时释放。可以通过delete操作符来显式删除对象,或者使用QObject的父子关系自动管理机制。
// 示例:注意对象的生命周期
QObject *parent = new QObject;
QObject *child = new QObject(parent);// 显式删除对象
delete parent; // 这将同时删除 parent 和 child// 或者使用父子关系自动管理
// 当 parent 被删除时,child 会自动删除

总结

Qt中的对象树是一个强大而灵活的概念,它为Qt应用程序提供了自动的内存管理、事件传播和资源共享等机制。通过深入理解对象树的工作原理和使用方法,开发者可以更加高效、安全地开发Qt应用程序。

相关文章:

初识Qt:从Hello world到对象树的深度解析

Qt中的对象树深度解析 Hello world1.图形化界面创建命令行式创建在栈上创建在堆上创建为什么传文本需要QString,std::string不行吗?那为什么要传入this指针?为什么new后不用显示调用delete函数呢,不会造成内存泄漏问题吗&#xff…...

多维数据库创建

多维数据库 小白的数据仓库学习笔记 2024/5/21 上午 文章目录 多维数据库Cube的作用:什么是多维数据库维的级别多维数据分析方法如何构建多维数据集?创建项目创建数据源创建数据源视图创建多维数据集维度表中缺失的值拖拽过去建立维度结构设计类型启动连…...

win11安装docker运行Open-Webui 界面化展示 ollama大模型

1.OpenWeb UI运行需要docker 环境下载docker Get Started | Docker 2.需要命令提示符docker -v 查询是否安装成功; 查询docker详情docker version 3.github拉取open-webUi镜像Package open-webui GitHub 复制命令运行在命令提示符; 等待下载完成 4.到…...

网络模型-PoE技术

一、PoE简介 以太网供电PoE(Powerover Ethernet)是指通过以太网网络进行供电,也被称为基于局域网的供电系统PoL(PoweroverLAN)或有源以太网(Active Ethernet)。 1、PoE的优势: 可靠: 电源集中供电,备份方便。连接简捷: 网络终端不需外接电源&#xf…...

网站策划是什么

网站策划是指在建立、设计和运营一个网站时所采取的系统性规划和组织活动。它涵盖了从确定网站的目标和目标受众到确定内容、功能、设计和营销策略等方面的各个方面。在今天互联网时代的背景下,网站已经成为企业、组织和个人展示自身形象、提供信息和服务、开展交流…...

MySQL基础学习: SET FOREIGN_KEY_CHECKS = 0

文章目录 一、介绍二、使用方法三、注意事项 一、介绍 在MySQL中,SET FOREIGN_KEY_CHECKS 0; 是一个特殊的命令,用于临时禁用外键约束检查。这在你执行一些涉及多个表并且可能违反外键约束的批量操作时非常有用。 为什么需要禁用外键约束检查&#xf…...

信号:MSK调制和GMSK调制

目录 一、MSK信号 1. MSK信号的第k个码元 2.MSK信号的频率间隔 3.MSK信号的相位连续性 3.1 相位路径 3.2初始相位ψk 4.MSK信号的产生 原理框图 5.MSK信号的频谱图 二、高斯最小频移键控(GMSK) 1.频率响应 2.GMSK调制产生方式 2.1 高斯滤波器法 2.2 正交调制器法…...

计算请假申请时长

请假申请时提供一个开始和结束时间,计算这段时间内的上班时间为多少个小时 /*** 计算请假时长,周日不计算* param startTimeStr* param endTimeStr* return*/public double computeWorkTimeLength(String startTimeStr, String endTimeStr){// 获取配置的…...

linux-配置服务器之间 ssh免密登录

前言 在管理多台Linux服务器时,为了方便操作和自动化任务,实现服务器之间的SSH免密登录是非常有必要的。SSH免密登录可以避免每次远程连接时输入密码,大大提高效率。本文将详细介绍SSH免密登录的原理和实现步骤。 一、原理解释 SSH免密登录的实现依赖于SSH密钥对,主要是利用…...

Java入门基础学习笔记47——ArrayList

什么是集合呢? 集合是一种容器,用来装数据的,类似数组。 有数组,为什么还要学习集合呢? 数组定义完成并启动后,长度就固定了。 而集合是大小可变,开发中用的最多的。 集合的特点:大…...

案例题(第二版)

案例题目 信息系统架构设计 基本概念 信息系统架构(ISA)是对某一特定内容里的信息进行统筹、规划、设计、安排等一系列的有机处理的活动。特点如下 架构是对系统的抽象,它通过描述元素、元素的外部可见属性及元素之间的关系来反映这种抽象…...

基于python向量机算法的数据分析与预测

3.1 数据来源信息 该数据集来源于Kaggle网站,数据集中包含了罗平菜籽油的销售数据,每行数据对应一条记录,记录了罗平菜籽油销售数据。其中,菜籽产量、菜籽价格和菜籽油价格是数值型数据,共2486条数据。 通过读取Exce…...

传输层 --- UDP

一、简述与回顾 传输层:负责数据能够从发送端传输接收端 在TCP/IP协议中,我们用"源IP","源端口号","目的IP","目的端口号",和"协议号"来表示一个通信。…...

图书管理系统(Java版本)

文章目录 前言要求1.设置对象1.1.图书1.2.书架2.管理员3.功能的实现 2.搭建框架2.1.登录(login)2.2.菜单2.3.操作方法的获取 3.操作方法的实现3.1.退出系统(ExitOperation)3.2.显示图书(ShowOperation)3.3.查阅图书(FindOperation)3.4.新增图书(AddOperation)3.5.借出图书(Borr…...

全同态加密生态项目盘点:FHE技术的崛起以及应用

撰文:Chris,Techub News 在当今数字化的时代,隐私保护已成为一个全球性的焦点话题,特别是在加密货币和区块链技术快速发展的背景下。虽然当前的隐私技术在保护数据安全方面多有欠缺,引发了广泛的关注和批评&#xff0c…...

山脉数组的峰顶索引 ---- 二分查找

题目链接 题目: 分析: 我们很明显, 可以从峰值位置将数组分成两段, 具有"二段性", 所以可以用二分查找因为arr是山峰数组, 不存在相等的情况如果arr[mid] > arr[mid 1], 说明mid的位置可能是峰值, 移动right mid如果arr[mid] < arr[mid 1], 说明mid的位置…...

【简单介绍下7-Zip,什么是7-Zip?】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…...

SCSS基本使用:构建高效、可维护的CSS架构

SCSS基本使用&#xff1a;构建高效、可维护的CSS架构 SCSS&#xff08;Sassy CSS&#xff09;是一个流行的CSS预处理器&#xff0c;它扩展了CSS的功能&#xff0c;提供了变量、嵌套规则、混合&#xff08;Mixins&#xff09;、函数等强大的编程特性&#xff0c;使得开发者能够编…...

allegro 无法删除Xnet

allegro 无法删除Xnet Orcad中打开Constraint Manager之后&#xff0c;再生成网表&#xff0c;导入PCB后就会出现一堆Xnet网络。无法去除Xnet。 解决办法 在原理图ORCAD中&#xff0c; 1、打开Edit Object properties 2、选择Filter by:Capture 3、点击New Property 4、设置…...

2024年甘肃特岗教师招聘报名流程,速速查收哦!

2024年甘肃特岗教师招聘报名流程&#xff0c;速速查收哦&#xff01;...

【错误解决】使用HuggingFaceInstructEmbeddings时的一个错误

起因&#xff1a;使用huggingface构建一个问答程序时出现的问题。 错误内容&#xff1a; 分析&#xff1a; 查看代码发现&#xff0c;HuggingFaceInstructEmbeddings和sentence-transformers模块版本不兼容导致。 可以明显看到方法参数不同。 解决&#xff1a; 安装sentenc…...

C++中的四种类型转换运算符

隐式类型转换是安全的&#xff0c;显式类型转换是有风险的&#xff0c;C语言之所以增加强制类型转换的语法&#xff0c;就是为了强调风险&#xff0c;让程序员意识到自己在做什么。但是&#xff0c;这种强调风险的方式还是比较粗放&#xff0c;粒度比较大&#xff0c;它并没有表…...

k8s 1.28.10 浏览器访问6443查看api,需要证书

添加证书 使用client-certificate-data和client-key-data生成一个p12文件 1.生成client-certificate-data grep client-certificate-data ~/.kube/config | head -n 1 | awk {print $2} | base64 -d >> kubecfg.crt2.生成client-key-data grep client-key-data ~/.kub…...

新火种AI|复旦团队在“冷冻人脑”领域获得重大进展!人工智能是否会对此形成助力?

​在低温医学领域&#xff0c;“冷冻人脑”技术的研究和突破既是重点&#xff0c;也是难点。因为这项技术关乎着人类是否可以取得一个令人瞩目的突破——人类的生命是否能够得到延续。 早几年&#xff0c;诸如“利用人体冷冻技术将身患绝症的病人保存十几年&#xff0c;几十年…...

echarts 散点图修改散点图中图形形状颜色大小

话不多说&#xff0c;直接上代码 let option {color:[xxx, xxx, xxx, xxx], //直接设置color可修改图形颜色title: {text: 散点图图形,},tooltip: {trigger: axis,axisPointer: {type: cross}},legend: {top: 2,right:2,itemWidth: 10,itemHeight: 10,textStyle:{fontSize:14}…...

SpringBoot3.x + JDK21 整合 Mybatis-Plus

前言 SpringBoot3.0 开始最低要求 Java 17&#xff0c;虽然目前最新的版本为 JDK22&#xff0c;但是在官网上看到 JDK23 在今年9月又要发布了&#xff0c;感觉这 JDK 也有点太过于给力了 所以我们选择用目前的 LTS 版本 JDK21 就好了&#xff0c;不用追求最新的 springboot 版…...

Java类和对象(五)—— 抽象类、接口、Object类和内部类

抽象类 在继承体系下&#xff0c;父类有些方法可能是要被重写的&#xff0c;如果我们事先就知道某些方法需要重写的话&#xff0c;我们可以不用在父类里面具体实现这个方法&#xff0c;这时候我们会用到抽象方法&#xff0c;这时候我们会用到关键字abstract关键字来修饰 publ…...

图像上下文学习|多模态基础模型中的多镜头情境学习

【原文】众所周知&#xff0c;大型语言模型在小样本上下文学习&#xff08;ICL&#xff09;方面非常有效。多模态基础模型的最新进展实现了前所未有的长上下文窗口&#xff0c;为探索其执行 ICL 的能力提供了机会&#xff0c;并提供了更多演示示例。在这项工作中&#xff0c;我…...

汇编:函数以及函数参数传递

汇编语言中的函数&#xff08;或过程&#xff09;是指一段可以被调用和执行的代码块&#xff1b;它们用于组织和重用代码&#xff0c;并使程序结构更加清晰&#xff1b;由于汇编语言没有高层次语言的语法糖&#xff0c;编写和调用函数涉及直接的堆栈操作和寄存器管理&#xff1…...

linux-ftp服务器搭建简介

安装ftp服务器&#xff1a; vsftpd全称为“very secure FTP daemon”&#xff0c;是一个在UNIX类操作系统上运行的服务&#xff0c;可以提供高安全性的FTP服务。 vsftpd是一个免费和开放源代码的FTP服务器软件&#xff0c;它提供了许多其他FTP服务器不支持的特性&#xff0c;例…...