Qt项目文件以及对象树

news2025/1/16 9:16:16

"在哪里走散,你都会找到我~" 


        前篇,我们仅仅对Qt创建了第一个简单的项目。相比于使用其他IDE创建工程项目,Qt会为自动创建诸如:.pro、.h\.cpp、.iu等文件,这些文件到底是什么?我们在使用Qt时 应该怎样去看待?

——前言

Qt项目文件解析

(1) .pro文件        

        当我们将工程文件创建好了之后,在⼯程⽬录列表中有⼀个后缀为".pro" 的⽂件,这个“.pro”文件就是工程文件。它是由qmake自动产生的,用于生产makefile配置的文件。

什么是makefile?

一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。        

        makefile在Linux中使用得较为频繁,其工作目的就是完成源文件编译。在Qt Creator中已经把整个过程中的编译细节封装好了,对于使用者的我们来说,不用在意里面的内容:

(2) widget \main.cpp ⽂件解析

        当我们使用Qt Creator创建项目时,会自动为我们写好完整调用的main函数。

        在Qt中,着重强调类的封装。Qt ⼀个类对应⼀个头⽂件,类名 就是 头⽂件名。

QApplication 为应⽤程序类:
要想编写一个Qt的图形化界面程序,必须要有一个QApplication对象。

        除此之外,还会为我们创建在新建项目时,选择的“Widget”:

         

        这里提到了两个概念,一个是“Q_OBJECT”,另一个是“对象树”。

Q_OBJECT宏:

        这是一个Qt内置的一个宏。当代码被替换展开后,就是一堆代码块。Qt中一个很重要的机制就是“信号和槽”。如果想要使用这一个机制,就必须包含这个宏。

对象树:

        Qt中引入了“对象树”机制。这个树到底是做什么的呢?我们在这里就把它简单地认为是一个对象资源管理的机制。当我们创建一个Qt对象,就可以将它挂在对象树上,由它来控制这个资源的释放销毁。似乎同“垃圾回收”机制类似,但它对性能的影响很小。

                

(3) widget.ui ⽂件解析

        当我们点击这个文件时,Qt  Creator会为我们Qt Design上:

    当我们再次返回到编辑,点击这个.ui文件时,就会变成这样:

        如果你了解过前端,那么你看到这样神似的代码,似乎会联想到“.html”。不过,虽然它们极其相似,但.ui文件是由"xml"格式输写的。

        在xml中,有哪些标签,表示什么含义都是通过程序员自定义的。此处的xml中的标签,就是大佬们开发的专属Qt的标签。至于每个标签是啥含义呢,并不需要我们去关心,我们只需要知道.ui文件本质上是一个xml格式的文件即可。

        当我们对当前.ui文件进行编译,打开左上方项目的“展开Expoler”:
        找到同层目录下的新目录。这些以“build-xx”开头的新目录,这是我们将Qt程序启动后,自动生成的临时文件:
         我们打开ui文件:
        所以,ui文件的本质,最终会被Qt Creator翻译成C++文件,并编译到可执行程序之中。                  

        其中,我们还能看到由qmake自动生成的makefile。


Qt对象树

        在 Qt 中创建很多对象的时候会提供⼀个 Parent 对象指针,这些Parent指针都需要被进行构造,可是,为什么需要构造这些Parent指针呢?

        对于C\C++ 程序员而言,该语言为了追求性能,并没有提供类似“垃圾回收”的机制。所以,当使用程序申请堆上空间、或者是文件描述符、套接字等系统资源,需要由程序员手动回收。可是!只要是人工操作,就可能失误,就会出现申请的资源不能得到及时释放,从而让系统内的资源被占用,系统剩余资源越来越少,导致机器变卡甚至宕机……上述的种种,换句话说,也就是“资源泄露”。

(1) QObject

        在Qt中,QObject是对象模型的核心。它是以“对象树”的形式组织起来的。

🥪 当创建一个QObject对象时,会看到 QObject 的构造函数接收⼀个 QObject 指针作为参数,这个参数就是 parent,也就是⽗对象指针。

🥪 这相当于,在创建 QObject 对象时,可以提供⼀个其⽗对象,我们创建的这个 QObject 对象会⾃动添加到其⽗对象的 children() 列表。

🥪 当⽗对象析构的时候,这个列表中的所有对象也会被析构。

如何理解QWidget 是能够在屏幕上显⽰的⼀切组件的⽗类?                     

        QWidget 继承自QObject。当然不止QWidget,几乎所有的类对象都会去继承这个QObject。也是因为这种继承,也继承了这种对象树的关系。    

        使用对象树,把这些内容组织起来,等到合适的时机(窗口关闭\进程结束等等),把这些对象统一进行释放。

     

• Qt 引⼊对象树的概念,在⼀定程度上解决了内存问题。

释放规则:
🌯 当⼀个 QObject 对象在堆上创建的时候,Qt 会同时为其创建⼀个对象树,而对象树中对象的

顺序是没有定义的。
🌯  任何对象树中的 QObject 对象 delete 的时候,如果这个对象有 parent,则⾃动将其从 parent 的 children() 列表中删除;如果有孩⼦,则⾃动 delete 每⼀个孩⼦。

(2) 自定义类挂对象树        

        比如现如今,我们想要我们自定义的类MyLabel,继承QLabel,并尝试将其挂在对象树上:

         

 


Qt 窗⼝坐标体系 与 日志输出

        坐标体系:以左上⻆为原点(0,0),X向右增加,Y向下增加。其中(0,0)坐标的位置指的是Widget对象的左上角。

        我们在.ui文件中,能看到的“画板”,其本质上就是QWidget窗口:

         我们在这个窗口中添加一个"按钮Button":

        我们还可以通过代码的方式,创建一个Button,并把它显示在最终程序运行的窗口上:
 

         

编码问题:

        现在,我们想使用std::cout 作为日志输出打印在Qt Creator中的观察台中:

        我们会发现,从屏幕输出的文字完完全全是乱码!

        关于乱码的问题,有且仅有一个原因,就是编码方式不匹配!目前汉字字符集最常见的两种方式就是:UTF-8(utf8) 和 GBK。我们Windows简体中文版自带的就是按照GBK的编码方式,对汉字进行翻译的。相反Linux中,使用的汉字编码集为utf8。

GBK. 使用两个字节表示一个汉字。

UTF-8/utf8 变长编码。表示一个符号,使用的字节数有变化,2~4。但汉字一般又3个字节表示。

        因此,在Qt中如果想要通过打印日志的方式,观察程序、调试信息,最好使用Qt提供的qDebug。虽然cout也不是不能用,但是std::cout内部不会对编码作任何处理,在持有不同编码集中使用,会导致乱码;

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

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

相关文章

欢迎来到 Greasy Fork,这里是一个提供用户脚本的网站。

官方地址: https://greasyfork.org/zh-CN 欢迎来到 Greasy Fork,这里是一个提供用户脚本的网站。 脚本适用于: baidu.com bilibili.com qq.com iqiyi.com sohu.com 更多… 用户脚本是什么? 用户脚本是一段代码,它们能…

前端——CSS

目录 文章目录 前言 一.CSS简介 1.CSS选择器 2.CSS选择器语法 3.CSS样式引入 4.CSS 高级选择器 二.CSS样式 1.字体 ​编辑 2.文本 3. 背景 4.边框 5.边距 6.浮动 7.清除浮动 8.定位 9. 列表样式 10.伪类样式 三.盒子模型 四.CSS3新特性 1.边框 2.盒子阴影 …

win11设置mysql开机自启

目录 命令式 1、打开命令提示符或 PowerShell: 2、使用管理员权限运行命令行工具: 3、设置 MySQL 服务为开机自启动: 4、启动 MySQL 服务: 5、 验证设置是否生效: 操作视图式 1、右击任务栏 ---> 选择任务管…

[晓理紫]每日论文分享(有中文摘要,源码或项目地址)--强化学习、模仿学习、机器人、开放词汇

专属领域论文订阅 关注{晓理紫|小李子},每日更新论文,如感兴趣,请转发给有需要的同学,谢谢支持 如果你感觉对你有所帮助,请关注我,每日准时为你推送最新论文。 分类: 大语言模型LLM视觉模型VLM扩散模型视觉…

经典目标检测YOLO系列(三)YOLOV3的复现(1)总体网络架构及前向处理过程

经典目标检测YOLO系列(三)YOLOV3的复现(1)总体网络架构及前向处理过程 和之前实现的YOLOv2一样,根据《YOLO目标检测》(ISBN:9787115627094)一书,在不脱离YOLOv3的大部分核心理念的前提下,重构一款较新的YOLOv3检测器,来对YOLOv3有…

网络安全科普:SSL证书保护我们的网上冲浪安全

当我们在线上愉快冲浪时,各类网站数不胜数,但是如何判定该站点是安全还是有风险呢? 当当当,SSL数字证书登场!! SSL证书也称为数字证书,是一种用于保护网站和用户之间通信安全的加密协议。由权…

SERVLET生命周期API

SERVLET生命周期API 在servlet的生命周期中,将发生创建Servlet上下文、创建会话、向Servlet上下文添加属性等各种事件。在servlet的生命周期内发生事件时,Web容器将通知侦听器类。要接收事件的通知,侦听器类需要扩展Servlet API的侦听器接口。 1. 事件类型 servlet生命周期…

DeepL 解除翻译文档的编辑限制

在使用DeepL官网翻译文档时,您可能会遇到无法编辑的问题。本文将详细介绍如何解除密码限制,使DeepL翻译文档变得可编辑。 第一步:文档翻译和下载 将需要翻译的文档上传至DeepL,进行整篇文档翻译。完成翻译后,下载翻译…

yum指令——Linux的软件包管理器

. 个人主页:晓风飞 专栏:数据结构|Linux|C语言 路漫漫其修远兮,吾将上下而求索 文章目录 什么是软件包yum指令1.yum 是什么?2.Linux系统(Centos)的生态 3.yum的相关操作安装卸载yum的相关操作小结 软件源安…

[攻防世界]-Web:inget解析

查看网页 很明显,他是要我们输入id 这里我尝试了直接爆破,没有成功 解法一(用万能密码): payload如下: 我这里还尝试了id1 or true # 没有成功,应该是题目把#给过滤了 解法二: …

【Javaweb程序设计】【C00165】基于SSM的高考志愿辅助填报系统(论文+PPT)

基于SSM的高考志愿辅助填报系统(论文PPT) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于ssm的高考志愿辅助填报系统 本系统分为前台系统模块、后台管理员模块以及后台学生模块 前台系统模块:当游客打开系统的网址后&…

网络编程套接字(2)

UDP数据报套接字编程 API介绍 DatagramSocket DatagramSocket是UDP的Socket,用于发送和接收数据报. 操作系统中有一类文件,就叫做socket文件(普通文件/目录文件:在硬盘上的) socket文件:抽象的表示了网卡这样的硬件设备 DatagramSocket就是对socket文件进行读写,也就是借助网…

【Java】Spring注解开发

一、Spring注解开发 1 注解开发定义Bean对象【重点】 目的:xml配置Bean对象有些繁琐,使用注解简化Bean对象的定义 问题导入 问题1:使用什么标签进行Spring注解包扫描? 问题2:Component注解和Controller、Service、R…

2024-1-26学习任务:堆实现算法和topK问题

前言 本文的学习任务:关于堆的实现以及相关的基础操作,包括向上调整算法和向下调整算法,同时利用该算法解决常见的topk问题,之后再对两种算法的时间复杂度进行分析,加深理解。 1.堆的实现 前面提到过,堆…

Jmeter学习系列之一:Jmeter的详细介绍

目录 一、Jmeter的介绍 二、Jemeter的特点 三、Jemter相关概念 3.1采样器(Samplers) 3.2逻辑控制器(Logic Controllers) 3.3监听器(Listeners) 3.4配置元件(Configuration Elements&#…

算法沉淀——滑动窗口(leetcode真题剖析)

算法沉淀——滑动窗口 01.长度最小的子数组02.无重复字符的最长子串03.最大连续1的个数 III04.将 x 减到 0 的最小操作数05.水果成篮06.找到字符串中所有字母异位词07.串联所有单词的子串08.最小覆盖子串 滑动窗口算法是一种用于解决数组或列表中子数组或子序列问题的有效技巧。…

不确定优化入门:用简单实例讲明白随机规划、鲁棒优化和分布鲁棒优化

文章目录 1 引言2 学习动机3 经典问题4 解决方案4.1 忽略不确定性4.2 随机规划4.3 鲁棒优化4.4 分布鲁棒优化 5 总结相关阅读 1 引言 按2024的原定计划,今年开始要学习不确定优化了。 粗略翻阅了一些相关的书籍和教程,大都包含许多数学公式&#xff0c…

xxl-job相关面试题整理

什么是xxl-job? ​ xxl-job是一个分布式的任务调度平台,其核心设计目标是:学习简单、开发迅速、轻量级、易扩展,现在已经开放源代码并接入多家公司的线上产品线,开箱即用。xxl是xxl-job的开发者大众点评的许雪里名称的…

腾讯云幻兽帕鲁4核16G14M服务器性能测评和价格

腾讯云幻兽帕鲁服务器4核16G14M配置,14M公网带宽,限制2500GB月流量,系统盘为220GB SSD盘,优惠价格66元1个月,277元3个月,支持4到8个玩家畅玩,地域可选择上海/北京/成都/南京/广州,腾…

在windows环境下安装hadoop

Hadoop是一个分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。但这个架构是基于java语言开发的,所以要先进行jdk的安装,如果电脑已经配置过jdk或者是曾经运行成功过java文件,那就可以跳过第一步。 …