【Qt 入门系列】从应用场景到开发环境:建立对 Qt 的第一层认知

🔥 本文专栏:Qt

🌸作者主页:努力努力再努力wz

💪 今日博客励志语录真正改变命运的,不是突然开窍的那一天,而是你明明很累,却还是没把自己交出去的那些晚上。


思维导图:

Qt 入门第一课:从应用场景到框架本质,建立对 Qt 的基本认知

从软件开发方向出发,认识 Qt 的定位

从本篇博客开始,我们将正式进入 Qt 的学习。

作为 Qt 系列的第一篇博客,本文并不会一上来就直接介绍"Qt 是什么",也不会立刻开始编写 Qt 程序。因为在真正接触一个技术框架之前,先建立对它的基本认知是很有必要的:它为什么会出现?它主要解决什么问题?它到底适合用来做什么?

只有先理解了这些背景,再去学习 Qt 本身的语法、工程结构和程序运行机制,后面的内容才不会显得零散。因此,本文会先围绕 Qt 的定位、作用以及发展背景展开,为后续学习打下基础。

首先,我们先回答第一个问题:Qt 究竟是用来做什么的?

要回答这个问题,可以先从软件开发中的岗位和开发方向说起。在互联网行业中,常见的岗位大致可以分为开发、测试、运维、产品经理等方向。而对于大多数学习编程的同学来说,最常接触到的通常还是开发方向。

开发方向内部又可以继续细分,比如前端开发、后端开发、客户端开发、嵌入式开发等。其中,后端开发一般主要负责服务器端程序的设计与实现,例如处理客户端请求、访问数据库、完成业务逻辑并返回结果。而前端开发则更偏向于用户界面的展示与交互,比如我们在浏览器中打开一个网页,页面中看到的内容、按钮、输入框以及交互效果,通常都属于 Web 前端开发的范畴。

除了网页端之外,还有一类程序同样需要面向用户提供图形化交互界面,比如电脑上的桌面软件、移动端 App,以及一些嵌入式设备上的操作界面。这类程序通常可以归入 客户端开发GUI 应用开发 的范畴。

Qt 最典型的应用场景,正是客户端图形化应用程序的开发

更准确地说,Qt 是一个基于 C++ 的跨平台应用开发框架。它最常见的用途是开发带有图形化界面的客户端程序,例如桌面端软件、嵌入式 GUI 程序等。通过 Qt,开发者可以使用一套相对统一的 C++ 接口,完成窗口创建、按钮布局、事件处理、用户交互等图形界面相关的开发工作。

需要注意的是,Qt 虽然和"前端"一样,都涉及用户界面和人机交互,但严格来说,Qt 并不等同于我们通常所说的 Web 前端。现在提到"前端",大多数情况下指的是基于 HTML 等技术栈的网页端开发。而 Qt 更准确的定位应该是:C++ 体系下的客户端 GUI 应用开发框架

因此,到这里我们可以先建立对 Qt 的第一层认知:

Qt 主要用于开发客户端图形化应用程序,它为用户提供可视化的人机交互界面,同时通过跨平台封装,让开发者可以用一套相对统一的 C++ 接口,在不同操作系统上开发 GUI 程序。

从文本交互到图形界面:理解 Qt 的跨平台优势

根据上文,我们已经知道了 Qt 的一个核心用途:开发客户端图形化应用程序,也就是 GUI 程序

这里需要注意的是,在"客户端程序"前面,我专门加了一个限定词------图形化。因为客户端程序并不一定都以图形界面的形式呈现。从人机交互方式的角度来看,客户端程序常见的交互形式大致可以分为两类:一种是基于文本的交互方式,另一种是基于图形界面的交互方式。

首先来看基于文本的交互方式。比如我们平时编写 C++ 程序时,代码编译运行之后,通常会在终端中看到程序的执行结果。程序可以通过 coutprintf 将内容打印到终端,用户则可以通过键盘输入数据或命令,与程序进行交互。

这种基于终端的文本交互方式,本身没有问题,而且在很多场景下效率非常高。例如,我们想要重命名一个文件,并将其移动到新的目录下,在命令行中可能只需要输入一条 mv 指令就可以完成操作。但是如果换成图形化界面,往往需要通过鼠标点击、选择目录、拖拽文件等一系列动作来完成。

也就是说,对于熟悉命令行的用户来说,文本交互方式往往更加高效,也更适合开发、运维、批处理等专业场景。

但是,这种交互方式的代价也很明显:它不够直观

对于普通用户来说,如果想要通过命令行与程序交互,就必须先学习对应的命令、参数以及使用规则,这会带来一定的学习成本。因此,文本交互方式虽然高效,但更多时候适合面向开发者、运维人员等专业用户。

而如果一个客户端程序面向的是普通用户,那么图形化界面通常就更加重要。因为图形化界面可以通过窗口、按钮、菜单、输入框、图标等可视化元素,将程序的功能更加直观地展示出来。用户不需要记忆复杂的命令,只需要通过鼠标点击、键盘输入、拖拽等方式,就可以完成与程序的交互。

这也就是我们前面提到的 GUI,也就是图形用户界面。

因此,到这里我们可以进一步明确 Qt 的应用场景:Qt 主要用于开发带有图形化界面的客户端应用程序,它的目标之一,就是帮助开发者构建更加直观、易用的人机交互界面。

当然,市场上能够开发 GUI 客户端程序的工具并不只有 Qt。既然存在多种 GUI 开发技术,那么我们选择学习 Qt,就说明 Qt 本身一定具备一些值得关注的优势。

那么,Qt 的优势究竟是什么呢?

Qt 最典型、也是最容易被初学者理解的一个优势,就是 跨平台性

在实际开发中,我们开发出的图形化客户端程序,通常并不希望只能运行在某一个操作系统上。比如一个桌面软件,如果只能运行在 Windows 平台,那么它面对的用户群体就会受到限制。而如果同一款软件能够同时运行在 Windows、Linux、macOS 等不同平台上,那么它能够覆盖的用户范围就会更广。

但是,不同操作系统底层提供的 GUI 开发接口并不相同。也就是说,如果开发者直接面向操作系统提供的原生 API 编写图形化程序,那么 Windows 平台可能需要写一套代码,Linux 平台可能又需要写另一套代码,macOS 平台还可能需要再写一套代码。这样一来,开发成本和维护成本都会明显上升。

而 Qt 的价值就在于,它对不同操作系统底层的窗口系统、事件机制、绘图接口等差异进行了封装。对于 Qt 开发者来说,更多时候并不需要直接面对某一个具体操作系统的底层 API,而是面向 Qt 提供的一套相对统一的 C++ 接口进行开发。

也就是说,开发者可以使用 Qt 编写一套相对统一的代码,然后由 Qt 在底层适配不同的操作系统平台。这样就大大降低了跨平台 GUI 程序的开发成本,也提高了程序开发和维护的效率。

当然,Qt 的跨平台并不意味着完全不需要考虑平台差异。比如程序的打包发布、系统路径、权限机制、平台风格以及某些系统级接口,仍然可能需要针对不同平台进行适配。

所以更准确地说,Qt 的跨平台能力并不是彻底消灭平台差异,而是通过对底层平台差异的封装,让开发者可以用一套相对统一的 C++ 接口,尽可能高效地开发跨平台图形化客户端程序


Qt 的发展历史:从跨平台基因到现实应用场景

根据上文,我们已经知道了为什么选择 Qt,也就是 Qt 最容易被初学者理解的一个特点:跨平台性。接下来,我们再简单了解一下 Qt 的发展历史。

Qt 其实并不是一个近几年才出现的新技术,而是诞生于上世纪 90 年代。它最初的设计目标,就和我们前面提到的内容密切相关:希望开发者能够使用一套相对统一的代码,开发出可以运行在不同操作系统上的图形化客户端程序

后来,Qt 由奇趣科技公司持续推动和发展。再后来,奇趣科技公司被诺基亚收购,因此 Qt 也进入了诺基亚体系。在诺基亚仍然活跃于手机市场的时期,Qt 曾经被用于其软件生态中,尤其是在塞班系统等平台上开发客户端应用程序。

不过,后来的移动端市场格局发生了很大变化。随着苹果手机和安卓生态的快速崛起,诺基亚在手机终端市场和移动操作系统领域的优势逐渐衰退。期间,诺基亚也曾经与微软合作,推出过 Windows Phone 相关产品线。但整体来看,诺基亚已经不再是智能手机时代的主导者,Qt 也逐渐离开了诺基亚体系,继续由后续的公司和社区推动发展。

也就是说,虽然诺基亚在移动端市场逐渐退出了主舞台,但 Qt 并没有因此消失。相反,Qt 作为一个跨平台 C++ 应用开发框架,至今依然保持着活跃,并且仍然在一些特定领域中发挥着重要作用。

当然,随着不同操作系统和软件生态的发展,每个平台也逐渐形成了自己更原生、更贴合自身系统特性的图形界面开发技术。比如微软的 Windows 系统、苹果的桌面系统、Linux 系统、安卓系统、苹果移动系统等平台,都有各自更加适配本平台的软件开发体系。

因此,Qt 和这些平台原生开发技术之间,其实存在一定的竞争关系。

不过这里需要注意,Qt 的优势并不是在每一个平台上都一定比原生开发方案更强。更准确地说,Qt 的优势在于跨平台和统一封装,而原生开发技术的优势则在于更贴合具体操作系统本身

如果只针对某一个特定操作系统开发应用程序,那么使用该平台官方推荐的原生开发技术,往往可以获得更好的系统适配性和平台体验。但是,如果一个程序希望同时支持多个平台,那么 Qt 的跨平台能力就会体现出价值。

所以,Qt 更像是一套面向多平台应用开发的通用框架。它通过对不同操作系统底层差异的封装,让开发者可以使用一套相对统一的 C++ 接口来开发图形化客户端程序。

尤其是在桌面端软件、嵌入式图形界面、工业控制软件等场景中,Qt 依然有着比较高的使用价值。特别是在嵌入式领域,很多设备都需要一个轻量、稳定、可定制的图形化界面,而 Qt 在这类场景中仍然是一个非常常见的选择。

因此,简单总结一下 Qt 的历史和定位:

Qt 从一开始就带有跨平台图形界面开发的基因。虽然不同操作系统都有自己的原生开发生态,Qt 在某些平台上不一定比原生方案更贴合系统,但它依然凭借跨平台能力、C++ 生态以及长期积累下来的成熟度,在桌面应用、嵌入式界面和工业软件等领域保持着自己的价值。


从库函数到框架:理解 Qt 的开发方式

认识了 Qt 的背景之后,接下来我们就把视角切换到 Qt 本身。

前面我们已经提到,Qt 是一套基于 C++ 的跨平台应用开发框架,常用于开发图形化客户端程序。这里就引出了一个新的概念:框架

那么,什么是框架呢?

在理解框架之前,我们可以先思考一个问题:既然 Qt 程序本质上也是使用 C++ 编写的,那么我们能不能不使用 Qt,而是完全自己用 C++ 从零开始实现一套图形化界面程序呢?

理论上当然可以。比如我们可以自己去实现窗口、按钮、菜单栏、输入框等界面组件,也可以自己处理界面的显示、用户输入等问题。

但是这样做的成本非常高。因为图形化程序并不只是把内容显示出来这么简单,它背后还涉及窗口创建、界面绘制、控件管理等一系列复杂问题。如果这些内容全部都由开发者自己从零实现,那么开发难度和维护成本都会非常高。

而所谓的框架,本质上就是前人针对某一类程序中经常出现的问题,提前总结并封装好的一套代码基础和开发结构。

也就是说,框架并不是让我们完全从零开始写代码,而是已经提前帮我们搭好了一个基础骨架。

这个骨架中并不是空的,它已经包含了很多提前封装好的代码。比如在 Qt 中,窗口、按钮、菜单栏、输入框、布局等常见界面能力,都已经被封装成了对应的类和接口。开发者不需要重新实现这些基础功能,而是按照 Qt 提供的方式去使用它们,并在这个基础上继续编写自己的界面和业务逻辑。

因此,Qt 不只是简单提供几个零散的库函数,而是提供了一整套用于开发图形化客户端程序的代码基础和开发结构。

Qt 之所以被称为框架,原因也在这里。

当我们使用 Qt 编写图形化客户端程序时,并不是完全按照自己的想法从头到尾随意组织代码。Qt 已经为 GUI 程序提供了一套相对成熟的开发结构,也提前封装好了很多图形界面开发中常用的基础功能。我们要做的事情,就是学习 Qt 的使用规则,然后在 Qt 提供的基础上完成自己的程序开发。

这种方式确实会限制一部分代码组织上的自由度,因为我们不能完全脱离 Qt 的规则随意编写程序。但是它带来的好处也很明显:很多复杂的底层细节已经被 Qt 封装好了,开发者不需要每次都从零开始造轮子,而是可以把更多精力放在具体的界面设计和业务逻辑上。

换句话说,框架的价值就在于:它牺牲了一部分自由度,但换来了更低的开发成本、更稳定的程序结构和更高的开发效率。

这里还需要简单区分一下框架和普通库函数。

在平时编写 C++ 程序时,我们经常会主动调用别人已经封装好的库函数。比如什么时候需要排序,就什么时候调用排序函数;什么时候需要输出,就什么时候使用 coutprintf。这些库函数通常只负责完成某一个具体功能。

而框架则不只是提供几个零散的函数,它更像是一整套程序开发结构。它不仅提供已经封装好的代码,它还会规定开发这类程序时的大致写法。也就是说,开发者不能完全按照自己的想法随意编写代码,而是需要遵循框架提供的结构和规则,在这个基础上完成编写程序。

所以,普通库函数更像是一个个独立的工具;而框架更像是一个已经搭好的程序骨架。开发者不是从零开始搭建整个程序,而是在这个骨架的基础上继续填充自己的内容。

因此,到这里我们可以对 Qt 建立更进一步的认识:

Qt 并不是让我们从零开始重新发明一套图形化界面系统,而是已经为 C++ 图形化客户端程序提供了一套成熟的开发框架。它提前封装好了窗口、按钮、菜单栏、输入框等常见界面能力,并提供了一套相对固定的开发结构。开发者只需要按照 Qt 的规则,在这个框架基础上编写自己的界面和业务逻辑,就可以更加高效地完成图形化客户端程序的开发。

从框架到开发环境:搭建 Qt 程序运行所需的工具基础

有了前面对 Qt 的基本认识之后,接下来我们就可以开始讲解 Qt 开发环境的搭建。

前面我们已经知道,Qt 是一套基于 C++ 的跨平台图形化客户端开发框架。这里需要注意,所谓"框架",首先是一个逻辑上的概念。它并不是单纯指某一个开发工具,也不是单纯指某一个可执行程序,而是指 Qt 已经为图形化客户端程序设计好了一套相对固定的开发方式。

也就是说,使用 Qt 开发程序时,我们并不是完全按照自己的想法从零开始随意编写代码,而是需要按照 Qt 提供的结构和规则来进行开发。Qt 已经为 GUI 程序准备好了一些基础能力,也规定了程序的大致执行流程。开发者要做的事情,就是在 Qt 提供的基础上,继续编写自己的界面代码和业务逻辑。

但是,框架虽然首先是一个逻辑概念,最终也必须通过具体的代码和工具落地。对于 Qt 来说,它在实际开发中会表现为一批具体的头文件、库文件、开发工具以及官方文档。

例如,Qt 提供的头文件可以让编译器知道 Qt 中有哪些类和函数;Qt 提供的库文件则保存了这些类和函数背后真正的实现代码;而 Qt Creator 这样的开发工具,则可以帮助我们更加方便地编写、管理、构建和运行 Qt 项目。

因此,搭建 Qt 开发环境,本质上就是为了让我们能够正常使用 Qt 这套框架。换句话说,我们需要准备好编写代码的工具、编译 C++ 程序的编译器,以及 Qt 本身提供的头文件、库文件和相关辅助工具。

因为使用 Qt 编写的项目,本质上仍然是 C++ 程序。既然是 C++ 程序,那么源文件最终就仍然需要经过编译和链接,才能生成真正可以运行的可执行文件。

所以,在 Qt 开发环境中,至少需要包含以下几个部分:

第一,需要有一个用于编写和管理代码的工具。Qt 官方提供了 Qt Creator,它是一个集成开发环境,也就是 IDE。IDE 并不只是一个普通的代码编辑器,它除了可以编写代码之外,还可以帮助我们管理项目、构建程序、运行程序以及进行调试。

第二,需要有一个 C++ 编译器。编译器的作用是将我们编写的 C++ 源代码编译成目标文件,再配合链接过程生成最终的可执行程序。在 Windows 平台下,常见的 C++ 编译器主要有两类:一类是 MinGW-w64 ,另一类是微软 Visual Studio 提供的 MSVC 编译器。

第三,需要有 Qt 本身提供的头文件和库文件。因为我们在代码中会使用 Qt 提供的类和函数,比如窗口、按钮、输入框等相关能力。编译时,编译器需要通过头文件知道这些类和函数如何使用;链接和运行时,则需要依赖对应的库文件。

第四,还会有一些辅助工具和官方文档。比如 Qt Assistant 可以用来查看 Qt 官方文档,Qt Designer 可以通过图形化方式设计界面。这些工具并不是理解 Qt 的核心前提,但在后续开发过程中会提高我们的学习和开发效率。

所以,我们从 Qt 官网下载并安装的内容,本质上就是为了搭建这样一套完整的 Qt 开发环境。它通常会包含 Qt Creator、Qt 库文件、Qt 头文件、编译器套件、官方文档以及一些辅助开发工具。

到这里,我们就可以先建立一个清晰的认识:

Qt 作为框架,逻辑上规定了图形化客户端程序的开发方式;而 Qt 开发环境,则是为了让这套框架能够真正落地运行所需要的一整套工具和代码支持。


在了解 Qt 开发环境之前,我们首先需要从 Qt 官网下载对应的安装包。这里需要注意,Qt 的安装路径最好选择一个固定且简单的目录,并且路径名中尽量不要包含中文、空格以及特殊符号。

之所以这样要求,是因为 Qt 开发过程中会涉及编译器、链接器、构建工具以及各种 Qt 工具之间的协作。如果安装路径中包含中文、空格或特殊符号,虽然不一定必然出错,但在某些场景下可能会导致路径解析异常,从而引发不必要的环境配置问题。

因此,对于初学者来说,最稳妥的方式就是将 Qt 安装到一个纯英文、无空格的路径下,例如:

text 复制代码
C:\Qt

我这里选择安装的是 Qt 6.11 版本。

前面我们已经提到,Qt 为我们封装好了很多图形化界面开发中常用的基础功能,这些功能最终会以 Qt 提供的类、函数以及库文件的形式提供给开发者使用。

由于我们编写的 Qt 项目本质上仍然是 C++ 程序,因此它最终也需要经历编译和链接过程,生成真正可以运行的可执行文件。

这里可以简单梳理一下这个过程:

首先,在编译阶段,编译器需要通过 Qt 提供的头文件知道这些类和函数如何使用。例如,当我们在代码中使用某个 Qt 类时,编译器需要先看到对应的类声明,才能判断代码语法、类型以及函数调用是否正确。

其次,在链接阶段,链接器需要处理目标文件中的外部符号。也就是说,当我们的代码调用了 Qt 提供的函数,而这些函数的具体实现并不在我们自己编写的源文件中时,链接器就需要确认这些符号可以由对应的 Qt 库文件提供。

如果链接的是动态库,链接阶段通常不会把这些函数的完整实现代码直接拷贝进最终的可执行文件中,而是会在可执行文件中记录它运行时依赖哪些动态库。等程序真正运行时,操作系统再去加载对应的动态库,并解析其中的函数实现。

在 Windows 平台下,动态库文件的后缀通常是 .dll;而在 Linux 平台下,动态库文件通常以 .so 作为后缀,例如 libxxx.so

因此,在 Windows 平台下运行 Qt 程序时,系统必须能够找到 Qt 对应的 .dll 动态库文件。为了让系统在程序运行时能够找到这些动态库,我们通常需要将 Qt 动态库所在的目录配置到系统环境变量 PATH 中。

以我的安装路径为例,Qt 动态库以及部分工具程序一般位于下面这个目录中:

text 复制代码
C:\Qt\6.11.0\mingw_64\bin

需要注意的是,PATH 环境变量主要解决的是程序运行时能否找到动态库的问题,编译阶段依赖头文件,链接阶段依赖库文件,而运行阶段则需要系统能够找到对应的动态库文件。

除了动态库之外,bin 目录下通常还会包含一些 Qt 提供的工具程序,比如 qmakewindeployqtassistantdesigner 等。

其中,assistant 是 Qt 提供的官方文档查看工具,可以帮助我们查询 Qt 中各种类、函数和模块的使用说明。

Qt Designer 则是 Qt 提供的图形化界面设计工具。正常情况下,我们编写程序通常是先手写代码,然后运行程序,再根据运行结果修改代码。而 Qt Designer 提供了另一种方式:它允许我们通过图形化拖拽的方式设计界面,例如拖动按钮、输入框、标签等控件,从而降低手写界面布局代码的成本。

至于 Qt Designer 设计出来的界面最终是如何和 C++ 代码结合起来的,后面学习到具体项目结构时再展开分析。

结语

那么这就是本篇文章的全部内容,带你认识Qt,接下来我会更新如何编写一个Qt程序,我会持续更新,希望你能够多多关注,如果本文有帮助到你的话,还请三连加关注,你的支持就是我创作的最大动力!

相关推荐
消失的旧时光-19431 分钟前
SQL 第四篇:JOIN 实战(数据库到底是怎么“拼表”的)
数据库·sql·mysql
炸膛坦客5 分钟前
嵌入式 - 数据结构与算法:(1-9)数据结构 - 队列(Queue)
c语言·数据结构
lbb 小魔仙16 分钟前
基于Python构建RAG(检索增强生成)系统:从原理到企业级实战
开发语言·python
深蓝轨迹34 分钟前
Spring Data JPA 实战指南:从基础配置到高级技巧
数据库·oracle·spring data jpa
代码的小搬运工37 分钟前
UITableView
开发语言·ui·ios·objective-c
刚子编程40 分钟前
C# Join 深度解析:参数顺序、多表关联与空值处理最佳实践
开发语言·c#·最佳实践·join·多表关联·空值处理
AbandonForce41 分钟前
哈希表(HashTable,散列表)个人理解
开发语言·数据结构·c++·散列表
爱喝水的鱼丶1 小时前
SAP-ABAP:SAP 与 ABAP 关联逻辑与入门路径:业务×开发的协作指南
服务器·前端·数据库·学习·sap·abap
代码中介商1 小时前
栈结构完全指南:顺序栈实现精讲
c语言·开发语言·数据结构
平凡但不平庸的码农1 小时前
Go 错误处理详解
开发语言·后端·golang