Qt的第一个程序

发布于:2025-06-25 ⋅ 阅读:(11) ⋅ 点赞:(0)

🌟🌟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的安装包可以私信我,你们的支持是博主坚持创作的动力!💪💪


网站公告

今日签到

点亮在社区的每一天
去签到