Qt的第一个程序

Qt的第一个程序

  • 1.hello world
  • 2.使用图形化拖拽方式
  • 3.使用C++代码的方式
    • 3.1.头文件
    • 3.2.setText
    • 3.3.对象树
  • 4.设计MyLabel
  • 5.乱码问题

🌟🌟hello,各位读者大大们你们好呀🌟🌟
🚀🚀系列专栏:【Qt的学习】
📝📝本篇内容:hello world;使用图形化拖拽方式实现;使用C++代码方式实现;头文件;setText;对象树;设计MyLabel;乱码问题
⬆⬆⬆⬆上一篇:Qt的入门
💖💖作者简介:轩情吖,请多多指教(>> •̀֊•́ ) ̖́-

1.hello world

在我们学习任何语言的时候,我们都会写的第一个程序就是hello world,这是大家总所周知的。在我们学习Qt时,也同样以这个来入门,首先要说明一下,使用Qt来实现显示hello world,有两种方法:使用C++代码来创建控件实现;使用图形化在界面上创建控件来实现。

2.使用图形化拖拽方式

在这里插入图片描述在这里插入图片描述
在这里插入图片描述其实使用拖拽的方式来显示hello world是非常简单的
在这里插入图片描述
看右上角,会显示我们使用了什么控件,这其实是一个树型结构,具体我们后面讲
在这里插入图片描述
我们也可以找到qmake生成C++代码进行一个观察
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
显示的界面都是基于这个C++代码

3.使用C++代码的方式

首先我们要知道,一般性我们以代码构造界面的时候都是在构造函数里面进行的,如下图,即Widget的构造函数中
在这里插入图片描述
接下来我先把代码展示出来,然后有部分细节需要详细讲一讲
在这里插入图片描述

3.1.头文件

在我们C/C++中写代码,肯定是需要包含头文件的,我们这里也不例外。但是我们这边在使用头文件时可能会出现不止一个选项,如下图
在这里插入图片描述
可以发现还有一个qlabel.h可以选,这主要是因为当初的C++的历史性原因造成的,当时C++的头文件就是这样的,直到后续C++有了标准,和C语言做了区分,因此才出现了QLabel这种样式。我们Qt并且有一个好处就是类的名字就是对应头文件的名字,这就在效率上大大提升。
接下来就是label的用法和意思
首先我们可以上网查一下label的意思,是"标签"的意思,简单来说就是在界面上显示字符串的控件。在我们写的代码中,使用的是在堆上开辟的空间,我们也可以使用在栈帧上开辟,都是可以的,但是更推荐在堆上,这个跟内存泄露有点关系,我们后面讲。接下来就是它的参数是this,这个和对象树有点关系,就是指定一个父对象,这边指的就是"widget",它的作用还是得后续再讲,因为跟内存泄漏也有关系,它们之间是相互作用的。

3.2.setText

接下来讲第二行代码,简单看上去它其实就是设置你想要显示的内容。但是有一个细节可以注意一下
在这里插入图片描述
编译器给出的提示是QString类型,这个是什么呢?这其实还是由于历史原因导致的,具体的不详细介绍,我们只需要知道这是Qt自己设计的容器,很多的Qt接口都是基于Qt自己设计的容器,Qt自己设计的容器和C++标准库的容器也方便转换,但是我们更推荐使用Qt自己设计的容器,因为它对于字符编码做了处理。
在这里插入图片描述
我们在一开始使用的是C语言格式的字符串,QString也提供了这种格式的构造函数,不过我们这边是通过隐式类型转换的
在这里插入图片描述
最后显示的界面中的hello world默认是在左上角的,我们可以通过设定位置控件来进行改变

3.3.对象树

首先我们要先来聊聊内存泄露,在C/C++的学习中,我们也经常聊到内存泄露,这种情况一旦频繁出现就会导致我们的程序会挂掉,那么在Qt这里也是如此的。我们前面创建的控件是在堆上开辟的,是不是也有内存泄漏呢?其实不然,不会出现内存泄露,这是因为有对象树的原因,还记得之前创建控件时传递的this参数吗
在这里插入图片描述
它的作用就是能够将创建的控件label给挂到对象树上,这个对象树是个N叉树,将界面上的控件通过对象树全部组织起来,如下图所示
在这里插入图片描述
虽然我们也可以在栈帧上创建控件,但是并不建议,这是因为这会导致在构造函数结束后,我们的控件也随之释放,那这会有什么现象呢?我们显示界面上会出现问题,界面还没结束,控件就不在了,如下图所示,在栈帧上创建控件,结果就是界面上什么都没有
在这里插入图片描述
但是我们怎么能来保证我们在堆上开辟的控件对象树一定会帮我们释放呢?这也就需要我们再做一个实验——自己设计一个简单的QLabel控件

4.设计MyLabel

既然要设计,那就需要重新创建一个项目,然后需要创建一个类,选择“文件”中的创建新文件或项目,如图所示选择
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们先来看一下创建好后的头文件,还是有点问题的
在这里插入图片描述
那就需要手动加上头文件
在这里插入图片描述
这时候我们看到也是需要去看对应的.cpp,这个时候我们可以直接点击键盘上的F4来进行直接跳转,通过F4可以在.h和.cpp互相跳转
接下来我们就需要进行写代码,既然需要将自己的类挂到对象上,那就需要继承QLabel并调用它的构造函数
在这里插入图片描述
在这里插入图片描述
挂到对象树的设定已经完成了,接下来就是自定义类最重要的任务:创建析构函数,这样才能看见有没有释放内存
我们可以在.h中写完一个函数声明后,可以按下Alt+Enter在对应的.cpp中生成函数定义了
在这里插入图片描述
在这里插入图片描述
接下来就是和之前一样的使用方法,在Widget中动态创建一个对象,然后执行,当我们关闭显示界面后,对象析构了,终端中就会出现打印内容
在这里插入图片描述
但是发现我们的结果是乱码

5.乱码问题

对于乱码问题,我们需要详细谈谈
出现这种问题一定是因为编码问题,像英文的话是通过ASCll码表来的,像我们汉字的话就有许多的中文编码方式,这里我们只说两个:GBK和UTF-8
GBK:是使用2个字节来表示一个汉字的,Windows简体中文版默认字符集就是GBK
UTF-8:是一种变长编码,一般长度是2-4个字节,并且支持各种语言,所以说中文也是比较流行使用UTF-8,一个汉字是3字节,Linux就是默认使用UTF-8
一个汉字具体是多少码值可以上网通过一些工具进行查找
也就是我们的打印的内容所在的文件的编码和显示终端的编码不一样,我们先来看一下文件的编码
在这里插入图片描述
如上图所示,我们可以先找到文件所在位置,通过记事本打开,点击文件中的另存为就可以看见右下角的编码,这里的编码就是现在这个文件的编码,这边显示UTF-8说明就是UTF-8编码,如果显示ANSI说明就是GBK编码。
我们的终端没办法进行设置编码,但是可以确定的是终端一定不是UTF-8编码
解决办法是我们的Qt中提供了QString可以帮助我们进行转换,但是我们先不使用这个,先讲一个新的,qDebug,它是专门用来打印日志用的,并且也能自动处理编码。
qDebug在中,我们一般不直接使用QDebug这个类,qDebug()实际上是一个宏,它封装了QDebug对象,我们可以把它看成cout一样使用
在这里插入图片描述
因此在后续中我们想要打印一些日志调试信息时就使用qDebug()而不是使用cout,因为在Windows下使用cout会有乱码问题,但是在linux下的使用Qt Creator就基本上不会有这种问题了,linux下默认编码时UTF-8。并且qDebug可以通过编译开关一键式关闭,在开发阶段,我们需要日志来调试观察,但是一旦发布给用户,就不能有这些日志,因此在这方面qDebug比cout也更有优势

🌸🌸Qt的入门大概就讲到这里啦,博主后续会继续更新更多Qt的相关知识,干货满满,如果觉得博主写的还不错的话,希望各位小伙伴不要吝啬手中的三连哦!如有小伙伴需要Qt的安装包可以私信我,你们的支持是博主坚持创作的动力!💪💪

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

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

相关文章

图书数据接口

基本说明: 接口地址:http://data.isbn.work/openApi/getInfoByIsbn?isbn{isbn}&appKey{appkey}返回格式:json请求方式:get请求示例:http://data.isbn.work/openApi/getInfoByIsbn?isbn9787513159074&appKey…

MongoDB原理

目录 一、概念 二、架构 2.1 逻辑结构 2.2 数据模型 2.3 存储引擎:WiredTiger 三、事务 一、概念 MongoDB是文档数据库,基本存储单元是 文档(Document),以BSON格式(一种类json的二进制形式&#xff…

《解码音频:从基础到未来的听觉探索》

音频:开启声音世界的大门 在生活的每一个角落,音频如影随形,编织出丰富多彩的听觉体验。清晨,第一缕阳光尚未完全照进房间,手机里温柔的闹钟铃声,将我们从睡梦中轻轻唤醒,开启活力满满的一天。通…

web安全之h2注入系统学习

起初是在N1 Junior 2025 上面碰到一题,考点是h2的sql注入。由于之前没有见过,趁此机会系统学习一番 实验代码 public class H2Inject {public static void main(String[] args) throws Exception{JdbcDataSource dataSource new JdbcDataSource();dataS…

AWS认证系列:考点解析 - cloud trail,cloud watch,aws config

🎯一句话总览: 服务名类比/角色主要功能CloudTrail监控摄像头录像回放记录“谁在什么时候做了什么操作”CloudWatch护士测体温 护士喊医生实时监控系统状态,并能报警/自动应对AWS Config保安巡逻 记录资产变更历史记录 AWS 资源的“配置状…

Java八股文——数据结构「数据结构篇」

了解哪些数据结构? 面试官您好,我了解并使用过多种数据结构。在我的理解中,数据结构可以分为几个大的类别,每一类都有其独特的优势和适用场景。 1. 线性结构 (Linear Structures) 这类结构的特点是数据元素之间存在一对一的线性…

C#测试调用EPPlus根据批注设置excel单元格内容

EPPlus也是常用的Excel文件操作库,但不同于ClosedXML,使用EPPlus前需要设置授权信息,商业应用需要设置商业授权,个人使用或非商业应用也需要设置授权(测试的时候只需设置全名,保存excel文件时会保存到文件详…

windows本地搭建skywalking, 线程池中traceId不丢失

1.从官网下载9.0.0版本 Downloads | Apache SkyWalking 其它历史版本的 下载地址 Index of /dist/skywalking 这个页面 可以下载 apm服务: apache-skywalking-apm-9.0.0.tar.gz agent的包: apache-skywalking-java-agent-9.0.0.tgz 2.解压后, (看情况去config路径下 appli…

多模态大语言模型arxiv论文略读(135)

Agent S: An Open Agentic Framework that Uses Computers Like a Human ➡️ 论文标题:Agent S: An Open Agentic Framework that Uses Computers Like a Human ➡️ 论文作者:Saaket Agashe, Jiuzhou Han, Shuyu Gan, Jiachen Yang, Ang Li, Xin Eric…

wpa_supplicant连接到了路由,但是 udhcpc会分配到不同网段的ip,路由器ip为192.168.0网段,板子分配ip为192.168.1的网段

wpa_supplicant连接到了路由,但是 udhcpc会分配到不同网段的ip,路由器ip为192.168.0网段,板子分配ip为192.168.1的网段 你提到的情况: 使用 wpa_supplicant 成功连接到路由器; 然后通过 udhcpc(DHCP客户端&#xff09…

[Hestia]开源网络服务器控制面板,快速、可靠、开源

测评介绍 本期测评试用一下Hestia这款面板。Hestia是一个由国际社区支持开发的开源项目,2019年正式发布,目前已积累1.1万余次代码提交,几乎每周都有十多次的代码提交,更新热度很高。仅支持比较新的debian和ubuntu,对于…

Windows 安装 Redis8.0.2

1.下载 Releases redis-windows/redis-windowshttps://github.com/redis-windows/redis-windows/releases 下载后直接解压到想要的安装目录就行了,启动Redis直接双击 redis-server.exe 文件就行了,Redis启动后双击 redis-cli.exe 就可以直接连接到Redi…

GitHub中openmmlab和Detectron2的区别

MMDetection 和 Detectron2 都是计算机视觉领域中流行的开源目标检测框架,它们有许多相似之处,但也存在一些关键差异。以下是两者的主要区别: 1. 开发团队与社区 MMDetection 由中国开源组织 OpenMMLab 开发维护,社区以中文用户为…

开疆智能CCLinkIE转ModbusTCP网关连接施耐德TCP从站配置案例

本案例是三菱PLC通过CCLinkIE转ModbusTCP网关连接施耐德Modicon M262 Logic/Motion Controller的配置案例 配置方法: 首先设置Modicon M262 Logic/Motion Controller Modbus TCP 从站设备 I/O 映射选项卡 I/O 以如下方式从主站视角映射到 Modbus 寄存器&#xff1…

【源码】Reactive 源码

前言 用了很长时间的 componsition-api 了,最近想看看源码,抱着单纯的学习心态先从 reactive 开始吧。 个人习惯: 看代码要带着问题去看,不要盲目的去看问题就是这次看源码的主线,要围绕着主线去展开,过…

银河麒麟 | ubuntu 安装国产达梦DM8数据库(安装+外网通+IDEA连接)

目录 官网下载安装 下载安装包 创建安装用户组dinstall 创建安装用户dmdba并指定组 创建DM8软件安装目录修改权限 检查、修改系统资源限制 解压.zip的压缩包 安装mount数据库 图形化安装 清除之前的挂载 开启Disql服务 修改dmdba的环境变量 检查状态 进入数据库 …

MySQL与Oracle视图:深入解析与全面对比

视图概念 视图在 MySQL 与Oracle中本质上是一种虚拟表,其数据并非实际存储,而是基于一个或多个基础表的查询结果动态生成。它像是对复杂查询的一种封装,极大地简化了数据的查询操作。例如,当我们需要频繁从多个关联表中获取特定数…

uniapp通过webview套h5时使用plus调取蓝牙/usb打印

安卓使用usb调取打印机 /*** 安卓usb调取打印机*param { string | bytes[] } html 传入的打印内容*传入一段文本或一个bytes数组* returns*/ export const printUsb (html) > {return new Promise((resolve, reject) > {if (!window.plus) return reject(new Error(&qu…

吃透 Golang 基础:基于共享变量的并发

文章目录 sync.Mutex 互斥锁sync.RWMutex 读写锁sync.Once 惰性初始化Goroutine 与线程动态栈Goroutine 调度GOMAXPROCSGoroutine 没有 ID 号 上一篇文章当中我们已经系统性地回顾了在 Go 当中基于 Goroutine 和 Channel 进行并发控制的方法,Goroutine 指的是 Golan…

智绅科技丨如何选择一家好的养老机构?

居家养老、社区养老和机构养老是我们在养老相关消息中常常听到的3个词。在地方文件中,居家养老和社区养老还经常被统称为居家社区养老或 社区居家养老。那么,这三者之间到底有什么不同呢? 居家养老服务涵盖生活照料、家政服务、康复护理、医…