声明:本人水平有限,博客可能存在部分错误的地方,请广大读者谅解并向本人反馈错误。
因为我个人对Qt也是有一些需求,所以开设本专栏进行学习,希望大家可以一起学习,共同进步。
这篇博客将从一个 Hello World 程序讲起,先讲述一个Qt Widgets 项目的创建、运行 和发布的过程;然后再将整个项目分解,从单一的主函数文件,到使用图形界面.ui文 件,再到自定义C++类和Qt图形界面类,一步一步分析解释每行代码,并从命令行编译运行,让小伙伴们清楚地看到 Qt Creator 创建、管理、编译和运行项目的内部实现。写完这篇博客,希望和小伙伴们一起掌握Qt项目建立、编译、运行和发布的整个过程。
一、 编写Hello World程序
加重
加重
加重
加重
突出
突出
1.1 新建Qt Widgets应用
第一步,选择项目模板。选择“文件→新建文件或项目”菜单项(也可以直接按下Ctrl+N快捷键,或者单击欢迎模式中的New Project按钮),在选择模板页面选择 Application 中的 Qt Widgets Application 项,然后单击 “选择”按钮,如下图所示。
第二步,输入项目信息。在“项目介绍和位置”页面输入项目的名称为 helloworld,然 后单击创建路径右边的“浏览”按钮来选择源码路径。 如果选中了这里的“设置默认的项目路径”,那么以后创建的项目会默认使用该目录,如下图所示。单击“下一步”进入下个页面。注意:项目名和路径中都不能出现中文。
第三步,选择构建系统。在Qt6之后出现该选项,其实我也没太搞懂qmake和Cmake的区别,所以我去询问了一下大佬(chatGPT),解答如下:
Qt中的
qmake
和CMake
都是用于构建项目的工具,但它们有一些区别。
-
语法和语言:
qmake
使用一种自己的领域特定语言(DSL),这种语言的语法比较简单,通常用于描述项目文件和构建规则。这种语言的学习曲线相对较低,但在复杂项目中可能会显得不够灵活。CMake
使用一种更加通用的脚本语言,即CMakeLists.txt文件。CMake的语法可能会更加灵活,并且可以更容易地编写复杂的构建规则。
-
跨平台性:
qmake
是Qt的官方构建系统,因此与Qt集成更加紧密,对于构建Qt项目来说更加直接。但在跨平台支持方面可能相对较弱,尤其是当涉及到非Qt库的时候。CMake
是一种更加通用的构建系统,它可以用于构建任何类型的项目,并且具有更好的跨平台性,能够更轻松地在不同的操作系统和编译器上工作。
-
社区和生态系统:
CMake
有着更加广泛和活跃的社区支持,因此可以更容易地找到解决方案、教程和插件等资源。qmake
虽然作为Qt的官方构建系统,但相比之下,其社区支持可能相对较小。
-
灵活性:
CMake
的模块化和灵活性使得它能够更好地处理复杂的项目结构和依赖关系。qmake
在处理复杂项目时可能会显得笨拙,并且很难实现一些高级功能。
总的来说,qmake
更适合于纯粹的Qt项目,特别是那些简单的、跨平台要求不高的项目。而对于更大型、更复杂的项目,以及跨平台支持要求较高的项目,CMake
通常更受欢迎。
说实话,我还是没看懂,不过感觉选择qMake
比较好。
第四步,细节选择。这里我们选择QWidget,选中"Generate form",选择这个选项之后就可以通过ui文件来搭建界面。
第五步,选择构建套件。这里显示的 Desktop Qt 6.4.3 MinGW 64bit 就是在上一篇博客看到的构建套件。
1.2 文件说明与界面设计
项目建立完成后会直接进入编辑模式。界面的右边是编辑器,可以阅读和编辑代 码。如果觉得字体太小,则可以使用快捷键Ctrl+“+”(即同时按下Ctrl键和十号键) 来放大字体,使用Ctrl+“-”(减号)来缩小字体,或者使用Ctrl键+鼠标滚轮,使用 Ctrl + 0(数字)可以使字体还原到默认大小。再来看左边侧边栏,其中罗列了项目中 的所有文件,如下图所示。
现在在helloworld文件夹,其中包括了6个文件,各个文件的说明如下表所列。这些文件的具体内容和用途会在后面的内容中详细讲解。
在Qt Creator 的编辑模式下双击项目文件列表中界面文件分类下的 widget.ui文件,这时便进入了设计模式,如下图所示。可以看到,设计模式由以下几部分构成:
1.2.1 主设计区
主设计区是上图中的中间部分,主要用来设计界面以及编辑各个部件的属性。
1.2.2 部件列表窗口(Widget Box)
窗口分类罗列了各种常用的标准部件,可以使用鼠标将这些部件拖入主设计区中, 放到主设计区中的界面上。
1.2.3 对象查看器(Object Inspector)
查看器列出了界面上所有部件的对象名称和父类,而且以树形结构显示了各个部 件的所属关系。可以在这里单击对象来选中该部件。
1.2.4 属性编辑器(Property Editor)
编辑器显示了各个部件的常用属性信息,可以更改部件的一些属性,如大小、位置 等。这些属性按照从祖先继承的属性,从父类继承的属性和自己属性的顺序进行了 分类。
1.2.5 动作(Action)编辑器与信号和槽编辑器
两个编辑器可以对相应的对象内容进行编辑。因为现在还没有涉及这些内容,所 以放到以后使用时再介绍。
1.2.6 常用功能图标
单击最上面侧边栏中的前4个图标(如下图)可以进入相应的模式,分别是窗口部件编辑模式(这是默认模式)、信号/槽编辑模式、伙伴编辑模式和 Tab 顺序编辑模式。后面的几个图标用来实现添加布局管理器以及调整大小等功能。
下面从部件列表中找到Label(标签)部件,然后按住鼠标左键将它拖到主设计区的界面上,再双击它进入编辑状态后输入“Hello World! 你好 Qt!”字符串。Qt Creator 的设计模式中有几个过滤器,就写着“Filter”的行输入框。例如,在部件列表窗口过 滤器中输入“Label”就快速定位到 Label部件,不用自己再去查找。其他几个过滤器作用也是这样。
二、 程序的运行与发布
2.1 程序的运行
2.1.1 编译程序运行
可以使用快捷键Ctrl+R或者通过按左下角的运行按钮来运行程序。如果是第一次使用,则会弹出“保存修改”对话框,这是因为刚才在设计模式更改了界面,而widget.ui 文件被修改了但是还没有保存。现在要编译运行该程序,就要先保存所有文件。
2.1.2 查看构建项目生成的文件
Qt Creator 将项目源文件和编译生成的文件进行了分类存放,helloworld文件夹中是项目源文件,这个文件夹存放的是编译后生成的文件。进入该文件夹可以看到如下图所示。
2.1.3 直接运行生成的可执行文件
双击运行 helloworld.exe,则弹出了如下图所示的警告对话框,提示缺少Qt5Cored.dl文件。
可以想到应用程序运行是需要dll动态链接库的,所以应该去Qt的安装目录下寻找该文件。下面直接介绍一个简便方法():
方法:可以直接将Qt的bin目录路径加入到系统Path 环境变量中去,这样程序运行时就可以自动找到bin目录中的dll文件了。
步骤:具体做法是右击“计算机”,在弹出的级联菜单中选择“属性”,然后在弹出的系统属性对话框中选择“高级系统设置”项。单击“环境变量”按钮进入环境变量设置界面。在“系统变量”栏中找到Path变量,单击“编辑”弹出编辑系统变量对话框。在变量值的最后添加 “C:\Qt\6.4.3\mingw_64\bin”然后单击“确定”即可,操作步骤如下图所示(我的系统是win11)。
现在双击文件夹里的.exe文件就可以直接运行了。
2.2 程序的发布
现在程序已经编译完成,那么怎样来发布它,让它在别人的计算机上也能运行呢? 前面生成的debug版本程序依赖的dll文件很大,那是因为debug版本程序中包含了调试信息,可以用来调试。而真正要发布程序时要使用release版本。下面回到Qt Creator 中对 helloworld 程序进行release版本的编译。在左下角的目标选择器(Target selector)中将构建目标设置为Release,然后单击运行图标。编译完成后再看项目目录中工程文件夹的release目录,其中已经生成了helloworld.exe文件。可以看一下它的大小,只有86KB,而前面的debug 版的 helloworld.exe 却有1.5MB,相差很大。
如果前面已经添加了Path 系统环境变量,那么现在就可以直接双击运行该程序。如果要使 Release版本的程序可以在别人的计算机上运行(当然,对方计算机也要是 Windows 平台),还需要将几个dll文件与其一起发布。可以在桌面上新建一个文件夹,重命名为“我的第一个Qt程序”,然后将 release 文件夹中的helloworld.exe 复制过来,再去Qt安装目录的bin目录中将 libgcc_s_dw2-1.dll, libstdc+±6.dll、lib- winpthread-1.dll、Qt5Core.dll、Qt5Gui.dll和Qt5 Widgets.dll这6个文件复制过来。 另外,还需要将C:\Qt\6.4.3\mingw_64\plugins目录中的platforms 文件夹复制过来(不要修改该文件夹名称),里面只需要保留 qwindows.dll 文件即可。现在整个文件夹一共有19.3MB,如果使用WinRAR等打包压缩软件对它进行压缩,就只有 6MB了,已经到达了可以接受的程度,这时就可以将压缩包发布出去了。
注意:若程序中使用了png 以外格式的图片,则发布程序时就要将Qt安装 目录下的 plugins 目录中的 imageformats文件夹复制到发布程序文件夹 中,其中只要保留自己用到的文件格式的dll文件即可。例如用到了 gif文件,那么只需要保留qgif.dll。如果程序中使用了其他的模块,比如数据库,那么就要将 plugins目录中的sqldrivers文件夹复制过来,里面只须保留用到的数据库dll文件。
到这里就已经完成了开发一个应用程序的最基本流程。下面再来看一个经常被提到的概念:静态编译。静态编译是相对于前面讲到的动态编译而言的。就像前面看到 的一样,在Qt Creator 默认的情况下,编译的程序要想发布就需要包含dll文件,这种编译方式被称为动态编译。而静态编译就是将Qt的库进行重新编译,用静态编译的Qt库来链接程序,这样生成的目标文件就可以直接运行,而不再需要dll文件的支持。 不过这样生成的exe文件也就很大了,有好几MB,而且静态编译缺乏灵活性,也不能部署插件。从前面的介绍可以看到,其实发布程序时带几个dll文件并不是很复杂的事情,而且如果要同时发布多个应用程序,还可以共用dll文件,所以使用默认的方式就可以了。想了解更多Qt发布的知识和静态编译的方法,可以在Qt Creator 帮助的索引方式下通过 Deploying Qt Applications 关键字查看, Windows 平台发布程序对应 的关键字是Qt for Windows-Deployment。
2.3 设置应用程序图标
若程序发布时想使exe文件有一个漂亮的图标,则可以在Qt Creator 的帮助索引 中查找 Setting the Application Icon 关键字,这里列出了在Windows上设置应用程序图标的方法,步骤如下:
第一步,创建.ico文件(可以去一些ico网站上下载)。将ico图标文件复制到工程文件夹的 helloworld目录中, 重命名为“hello.ico”。
第二步,修改项目文件。,在Qt Creator 中的编辑模式双击hello.pro文件,在最后面添加下面一行代码:
RC_ICONS = hello.ico
第三步,运行程序。,可以看到窗口左上角的图标已经更换了。然后查看一下 release 文件夹中的文件,可以看到,现在exe文件已经更换了新的图标。
现在只需要将这里的 helloworld.exe 复制到程序发布文件夹中,就可以得到一个完整而且漂亮的应用程序。对于整个流程而言,最后这步“设置应用程序图标”并不是必须的。这就是程序从创建到发布的整个过程。
三、往期回顾
【Qt学习笔记】(一)–Qt creator软件学习