【C++ Qt】认识Qt、Qt 项目搭建流程(图文并茂、通俗易懂)
每日激励:“不设限和自我肯定的心态:I can do all things。 — Stephen Curry”
绪论:
本章将开启Qt的学习,Qt是一个较为古老但仍然在GUI图形化界面设计中有着举足轻重的地位,因为它适合嵌入式和多种平台而被广泛使用,本章将先从认识Qt,再到理解Qt的作用和地位,再到Qt的安装下载,以及创建好一个Qt项目,再到最后的理解Qt项目中提前配备好的文件,带你入门Qt项目。
————————
早关注不迷路,话不多说安全带系好,发车啦(建议电脑观看)。
1. 认识Qt
首先QT是用来桌面应用开发(电脑上写的程序),其中Qt无法开发网页前端和移动开发(虽然目前qt支持了移动开发,但暂时还没啥厂商使用qt开发的)
QT客户端开发的重要任务:编写和用户交互的界面
在用户交互的界面:由两种典型风格构成:
- 命令行界面/终端界面(黑框框)TUI,常给程序员使用的专业软件
- 图形化界面 GUI 给普通用户使用(也就类似我们常用的windows环境)
而Qt就是用来编写 GUI程序的一套框架~~
在Windows编写GUI程序,有很多种方法,其中QT只是其中之一,windows下还有那些方案可以开发GUI:
- Windows API 系统原生提供的API,开发起来非常原始和繁琐(最简单古老的方式)
- MFC:使用了面向对象的方式,将Windows API接口进行封装使用(它的影响非常深远)
- QT:(1991年左右诞生)其中它和MFC类似同样的都是通过封装的方式写成
- 但MFC早就不更新了,而QT仍然在不断推陈出新
- GTK、WxWidget
- Windows Forms:一个给C#给量身定做的一套GUI技术体系(微软的编程语言 C#(C sharp))
- WPF、UWP(Windows Forms的升级版)
- Electron:本质上是吧HTML这样的网页,打包成一个Windows 上运行的客户端程序(最初用来开发atom文本编辑器的,后来atom没了,被微软的VsCode干趴了),但缺点是运行效率在上面的技术体系中是比较低的
2. Qt 是什么
Qt 是⼀个 跨平台的 C++ 图形⽤⼾界⾯应⽤程序框架 。
- 框架:本质就是一群大佬发明出来的,让我们可能更加方便靠谱的写出我们自己的代码(通过框架约束程序员)
- 其中库和框架都属于大佬把代码写好了,让我们使用
- 而库被程序员调用(程序员是主题)、框架则是占主题,程序员配合框架,完善填充框架中留出的一些细节
编写c++代码,框架当然也很重要。C++的生态是割裂的离散的,并不想Java存在巨无霸社群,统一天下
C++不同的开源社区、大厂,各自有各自的框架,各自为政
诺基亚的塞班系统:主推Qt来做作为开发
相比之下,像Qt这种,能被大家共识认可的框架,在整个c++生态中并不多见
1991年,计算机中,诞生了许多神奇的东西:Qt、vim、python、OpenGL、Linux、汤老湿…
QT支持的平台:
- Windows ‒ XP、Vista、Win7、Win8、Win2008、Win10(windows各个版本)
- Linux(各种发行版)尤其是Linux中的KDE桌面基于Qt 构建
- TUI 基于命令操作,门槛高但效率也高
- GUI 基于图形化操作,门槛低,效率也低
- 也有少数用户使用Linux 桌面,存在几套环境:GNOME(基于GTK 构建)、KDE(基于Qt 构建的),其中Linux桌面使用过程中有很多问题(容易崩溃)
- Mac系统
- 嵌入式系统
- 也是 Qt 主要的战场
- 日常使用的,冰箱、洗衣机、路由器。。。这些设备也需要计算机,但这些设备的计算机配置硬件就不用很高了,低配置、低成本,其中的图形化界面就是通过Qt 来写,这个领域中也受到了安卓的挑战
Qt 版本
⽬前最新的版本是 Qt 6. 但是相对来说 Qt 6 和 Qt 5 之间的核⼼功能区别不⼤. 并且企业中也仍然有⼤量的项⽬在使⽤ Qt 5.
另外 Qt 在发布的时候还提供了两种许可证:
- 商业许可: 开发者以商业⽬的使⽤Qt框架进⾏开发和发布软件的许可,开发者需要购买商业许可并按照相关规定使⽤Qt框架。商业许可提供了更多的功能和服务,适合于商业软件开发(需要花钱购买,其中购买它主要提供的是技术支持,买到就是一份服务)
- 开源许可: 开发者以⾮商业⽬的使⽤Qt框架进⾏开发和发布软件的许可,开发者可以免费使⽤Qt框架,但需要遵守开源许可协议的要求,如在软件中包含Qt许可协议的声明等(白嫖)
Qt 的优点
- 跨平台,⼏乎⽀持所有的平台;
- 接⼝简单,容易上⼿,学习 QT 框架对学习其他框架有参考意义。
- ⼀定程度上简化了内存回收机制(半自动的垃圾回收,简化内存释放,尽可能小的影响程序的效率)
- 开发效率⾼,能够快速的构建应⽤程序。
- 有很好的社区氛围,市场份额在缓慢上升。
- 可以进⾏嵌⼊式开发
Qt 的应⽤场景
- 桌⾯应⽤程序
Qt 能够创建各种类型的桌⾯应⽤程序,包括⽂件管理器、媒体播放器、绘图程序等。Qt 应⽤程序⽀持多种操作系统,可以运⾏在 Windows、Linux、macOS 等桌⾯操作系统上 - 移动应⽤程序
Qt ⽀持 Android 和 IOS 移动操作系统,为应⽤程序提供了强⼤的跨平台能⼒。可以使⽤ Qt 构建各种移动应⽤程序,例如社交应⽤、游戏、娱乐等 - 嵌⼊式系统
Qt 在嵌⼊式领域应⽤⾮常⼴泛,它可以构建⾯向各种设备的图形应⽤程序,在机顶盒、⻋载娱乐系统、安防监控设备等领域具有⼴泛的应⽤
开发的知名软件:
剪映、WPS Office 办公软件、Google Earth ⾕歌地图 、VirtualBox 虚拟机软件…
3. Qt 开发环境的搭建
需要安装3个部分:
- C++编译器(gcc/cl.exe,并不是Visual Studio不是IDE,编译器只是IDE调用的一个程序)
- Qt SDK(SDK 软件开发包)windows版本 Qt SDK里已经内置了 C++ 编译器(内置编译器是mingw,windows版本的gcc/g++)
- 需要有个 Qt 的集成开发环境(IDE)
- Qt Creator(Qt官方提供的,最容易入门,上手的方式,开箱即用不用怎么配置)虽然过程中存在许多bug 但整体来说挺方便
- Visual Studio(功能更强,但需要配置容易出错)
- Eclipse(并非只是Java IDE,本身是一个IDE平台可以搭配不同插件构成不同的IDE,但目前市场份额冲击很大 JetBrain、VSCode)
- 本质只用安装一个 Qt SDK,另外两个就有了
下载Qt SDK:
去官方网站(下载一个安装程序,首选官方网站)
Qt 的官方网站(下载5.14的一个版本相对于不算很新也不老):(国外网站可能速度较慢,想办法fq)
4. Qt Creator安装过程
- 关闭网络跳过注册
- 选择路径(安装软件所在目录常识:不要代中文、特殊符号以及空格)
- Qt SDK中内置的 c++ 编译器(windows 版本的gcc/g++)
给我们装好的Qt 配置一下环境变量(不是必须的,但经量配置上防止莫名的错误)
- 打开环境变量(windows搜索)
- windows 也是支持多用户的操作系统(分为用户变量、系统变量)
- 选择Path:也就和Linux中的环境变量是一样的(输入的一个命令从path路径中查找!)
- 此处就需要把Qt SDK中的某个目录假如到Path环境变量中(bin目录D:\Qt\Qt5.14.2\5.14.2\mingw73_64\bin,内部有许多动态库、exe的目录)
- 将系统变量中的Path中进行添加该目录:
配置环境变量是为了:
- 让操作系统 Qt Creator 工具 ,能够找到Qt SDK 中提供的exe
- 运行 Qt 程序的时候,能够找到 .dll 动态库(Windows环境中)
- 环境变量简单的理解成:“进程间通信” 机制(让一个进程借助环境变量找到另外一个进程)
对于安装成功后会有5个程序他们分别是:
- Assistant:离线官方文档,也就是存储许多的函数的使用方法(英文文档要有耐心)
- Designer:Qt 设计师,图形化的设计界面的工具,拖拽式的快速生成界面(后面经常使用,但是是搭配 Qt Creator来使用)
- Linguist:Qt 语言家,作用是对国际化进行支持,有点时候写的程序,要和国际接轨(允许单独创建一个 语言配置文件,把界面需要用到的各种文字,都配置到文件中,并且在文件中提前把各种一样的翻译配置进去)就可以通过简单的 api 切换这里的语言配置
- Qt 5.14.2:Qt 的命令行
- Qt Creator:Qt 的集成开发根据(学习Qt 过程中最主要的工具)
5. 初始创建Qt项目
- 打开QT Creator
- 打开右上角的文件选择新建(应用程序)
- 在选择Application
- Qt Widgets App…
- Qt 不仅支持C++、也支持 Python 和 Java
- 我们本处只涉及第一个 Qt Widgets 选择后继续
- 填写名称
- 路径
- 下一步
- 构建系统,通过Qt写的程序,涉及到一系列的 元编程技术(通过代码来生成代码)
- Qt 框架会在编译的时候,自动先调用一系列根据,基于你自己的代码,生成一系列的其他的 C++ 代码,最终编译的代码
- 其中 qmake 是老牌的Qt构建工具(默认选择qmake使用即可)
- CMake 并非Qt专属,很多的开源项目都会使用CMake
- 其中关注:Base Class:使用Qt Creator 创建项目,会自动的生成一些代码
- 生成的代码就包含一个类
- 此处就是要选择这个自动生成的类的父类
- 此处先选择QWidget进行学习
- 其中 Class name 就是自己生成的类,Base class 就是父类
- Qt 中内置的类都是以Q开头
- 而下面的就是文件名,他和上面的类是关联的(其中可以不一样,但经量保持一致)
- Form file 非常关键: Qt中创建图形化界面的程序,有两种方式
- 直接通过c++代码的方式创建界面
- 通过form file文件,以图形化的方式来生成界面(此时就可以使用Qt Designer 或直接使用Qt Creator 来编辑这个 ui 文件,从而以图形化的方式,快速方便的生成图形化界面)
- 这里是选择 翻译文件(对应的语言)暂时不关注,它是和国际化相关的
- 选择一下基于那个编译器的Qt SDK 来构建后续代码
- 就默认勾选 WinGW 就可以了
- 就默认勾选 WinGW 就可以了
- 可以选择版本控制工具(如git…)
- 最终完成就创建好了
- 当创建好后,在左下角有运行按钮(绿色三角):
- 其中注意我们创建项目过程中的存储路径,不要有中文路径!!
- 最终就会构建出一个图形化界面:
6. 认识界面及细节
在构建成功后,会自动生成main函数:
-
其中main函数中有:
- 必备的 QApplication对象
- Widget对象,根据对象就是我们创建项目时选择的QWidget
-
构建后会生成,Widget.h类
- 其中Q_OBJECT 是一个Qt内置的宏(宏的本质上就是文本替换)
- Q_OBJECT展开之后,就会生成一大堆代码
- Qt中有一个非常核心的机制,“信号” 和 “槽”
- 如果这个类想使用 信号和槽 就需要引入这个宏!
- 其中构造函数中的 parent 参数:
- 是一个引入的“对象树”机制(后续细讲)
- 创建的Qt对象给挂到对象树(N叉数)上
- 往树上挂的时候就需要指定 “父节点”
- UI::Widget* ui
- 它和 Form file 密切相关
- 其中Q_OBJECT 是一个Qt内置的宏(宏的本质上就是文本替换)
-
widget.cpp
-
form file
- 当我们双击 ui 文件,此时 Qt Creator 就会调用Qt Designer,打开UI文件,图形化的界面编辑器
- 此时在点击左侧的编辑按钮,就会 显示 ui 文件的本题
- 这个格式 也就是 xml 格式(和html类似,都是使用成对的标签来表示数据)
- xml 这里的标签,有那些标签有什么含义,都是程序员自己定义的(也就是qt开发的大佬们定义的),只用知道 ui 文件本质就是一个xml即可
- 类似的就是自定义应用层协议
- Qt 中使用 xml文件就是描述程序的界面是啥样的,进一步的qmake会调用相关的工具,依据这个xml文件生成一些c++代码,从而把完整的界面构造出来
- 当我们双击 ui 文件,此时 Qt Creator 就会调用Qt Designer,打开UI文件,图形化的界面编辑器
-
.pro:Qt 项目的工程文件,也是 qmake 工具 构建时候的重要依据
- 类似于 Linux 中学习的 makefile 文件
- qmake 搭配 .pro 起到的作用 和 makefile 类似的
- 而其中 我们这里并不用去学习 qmake 和 .pro 因为Qt Creator把这个过程都封装好了,所以我们并不用过多关注,仅需要点击运行即可
-
上面看到的 .h .cpp .pro .ui 都是源代码
-
如果编译运行 Qt 项目,构建过程中还会生成一些中间文件
-
打开文件管理器,查看项目对应的目录
-
其中我们在运行一次 程序后就会生成一个: build-xxxx
-
这个目录里面就是项目运行过程中,生成的一些临时文件:
- 其中就会有makefile文件(qmake + pro生成)、ui_widget.h(内部就是根据xml生成的代码),他们都是自动生成的
- ui_widget.h本质就是根据xml生成,也就是最终界面的效果展示的具体代码(具体逻辑如下图)
-
在Debug中还会有一个 .exe(他本质就是我们生成可执行程序也是生成的界面!)
-
本章完。预知后事如何,暂听下回分解。
如果有任何问题欢迎讨论哈!
如果觉得这篇文章对你有所帮助的话点点赞吧!
持续更新大量QT细致内容,早关注不迷路。
相关文章:

【C++ Qt】认识Qt、Qt 项目搭建流程(图文并茂、通俗易懂)
每日激励:“不设限和自我肯定的心态:I can do all things。 — Stephen Curry” 绪论: 本章将开启Qt的学习,Qt是一个较为古老但仍然在GUI图形化界面设计中有着举足轻重的地位,因为它适合嵌入式和多种平台而被广泛使用…...

IoT/HCIP实验-1/物联网开发平台实验Part2(HCIP-IoT实验手册版)
文章目录 概述产品和设备实例的产品和设备产品和设备的关联单个产品有多个设备为产品创建多个设备产品模型和物模型设备影子(远程代理) 新建产品模型定义编解码插件开发编解码插件工作原理消息类型与二进制码流添加消息(数据上报消息…...

Replacing iptables with eBPF in Kubernetes with Cilium
source: https://archive.fosdem.org/2020/schedule/event/replacing_iptables_with_ebpf/attachments/slides/3622/export/events/attachments/replacing_iptables_with_ebpf/slides/3622/Cilium_FOSDEM_2020.pdf 使用Cilium,结合eBPF、Envoy、Istio和Hubble等技术…...
推荐系统排序指标:MRR、MAP和NDCG
文章目录 MRR: Mean Reciprocal RankMAP: Mean Average PrecisionNDCG: Normalized Discounted Cumulative Gain3个度量标准来自于两个度量家族。第一种度量包括基于二进制相关性的度量。这些度量标准关心的是一个物品在二进制意义上是否是好的。第二个系列包含基于应用的度量。…...

数学建模之最短路径问题
1 问题的提出 这个是我们的所要写的题目,我们要用LINGO编程进行编写这个题目,那么就是需要进行思考这个怎么进行构建这个问题的模型 首先起点,中间点,终点我们要对这个进行设计 2 三个点的设计 起点的设计 起点就是我们进去&am…...

测试概念 和 bug
一 敏捷模型 在面对在开发项目时会遇到客户变更需求以及合并新的需求带来的高成本和时间 出现的敏捷模型 敏捷宣言 个人与交互重于过程与工具 强调有效的沟通 可用的软件重于完备的文档 强调轻文档重产出 客户协作重于合同谈判 主动及时了解当下的要求 相应变化…...

zynq 级联多个ssd方案设计(ECAM BUG修改)
本文讲解采用zynq7045芯片如何实现200T容量高速存储方案设计,对于大容量高速存储卡,首先会想到采用pcie switch级联方式,因为单张ssd的容量是有限制的(目前常见的m.2接口容量为4TB,U.2接口容量为16TB)&…...

brep2seq 论文笔记
Brep2Seq: a dataset and hierarchical deep learning network for reconstruction and generation of computer-aided design models | Journal of Computational Design and Engineering | Oxford Academic 这段文本描述了一个多头自注意力机制(MultiHead Attenti…...

【运维实战】Linux 中设置 sudo ,8个有用的 sudoers 配置!
在Linux及其他类Unix操作系统中,只有 root 用户能够执行所有命令并进行关键系统操作,例如安装更新软件包、删除程序、创建用户与用户组、修改重要系统配置文件等。 但担任 root 角色的系统管理员可通过配置sudo命令,允许普通系统用户执行特定…...
Ad Hoc
什么是 Ad Hoc? Ad hoc 一词源于拉丁语,意为“为此目的”或“为此特定原因”。一般来讲,它指的是为解决某一特定问题或任务(而非为了广泛重复应用)而设计的行动、解决方案或组合。在加密货币和区块链领域,…...

江科大SPI串行外设接口hal库实现
hal库相关函数 初始化结构体 typedef struct {uint32_t Mode; /*SPI模式*/uint32_t Direction; /*SPI方向*/uint32_t DataSize; /*数据大小*/uint32_t CLKPolarity; /*时钟默认极性控制CPOL*/uint32_t CLKPhase; /*…...

[网页五子棋][对战模块]前后端交互接口(建立连接、连接响应、落子请求/响应),客户端开发(实现棋盘/棋子绘制)
文章目录 约定前后端交互接口建立连接建立连接响应针对"落子"的请求和响应 客户端开发实现棋盘/棋子绘制部分逻辑解释 约定前后端交互接口 对战模块和匹配模块使用的是两套逻辑,使用不同的 websocket 的路径进行处理,做到更好的耦合 建立连接 …...

【ArcGIS Pro微课1000例】0071:将无人机照片生成航线、轨迹点、坐标高程、方位角
文章目录 一、照片预览二、生成轨迹点三、照片信息四、查看方位角五、轨迹点连成线一、照片预览 数据位于配套实验数据包中的0071.rar,解压之后如下: 二、生成轨迹点 地理标记照片转点 (数据管理),用于根据存储在地理标记照片文件(.jpg 或 .tif)元数据中的 x、y 和 z 坐…...

Ubuntu Zabbix 钉钉报警
文章目录 概要Zabbix警监控脚本技术细节配置zabbix告警 概要 提示:本教程用于Ubuntu ,zabbix7.0 Zabbix警监控脚本 提示:需要创建一个脚本 #检查是否有 python3 和版本 rootzabbix:~# python3 --version Python 3.12.3在/usr/lib/zabbix/…...

threejs顶点UV坐标、纹理贴图
1. 创建纹理贴图 通过纹理贴图加载器TextureLoader的load()方法加载一张图片可以返回一个纹理对象Texture,纹理对象Texture可以作为模型材质颜色贴图.map属性的值。 const geometry new THREE.PlaneGeometry(200, 100); //纹理贴图加载器TextureLoader const te…...

STM32 RTC实时时钟\BKP备份寄存器\时间戳
一、Unix时间戳 想要计算当地北京时间,需要根据经度和闰年之类的运算得到(c语言里面可以调用time.h的函数) 二、UTC/GMT(科普) 三、时间戳转化 C语言的time.h模块提供了时间获取和时间戳转换的相关函数,可以方便的进行秒计数器、…...
springcloud---gateway
目录标题 理解gateway代码示例filter与aop的联系ServerWebExchangeReactor 的 Context那是隐式传递Map吗Context和ThreadLocalSpring 的 AOP 是用的什么为什么过滤器要用异步非阻塞,而 AOP 用同步阻塞?理解gateway 代码示例 import io.netty.channel.Channel; import lombo…...

Axure设计案例——科技感立体柱状图
想让你的数据展示告别平淡无奇,成为吸引全场目光的焦点吗?快来瞧瞧这个Axure设计的科技感立体柱状图案例!科技感设计风格借助逼真的立体效果打破传统柱状图的平面感,营造出一种令人眼前一亮的视觉震撼。每一个柱状体都仿佛是真实存…...

app获取相册权限是否意味着所有相片都可随时读取?
针对安卓手机相册的隐私安全问题,我也比较好奇,App授予了相册权限,真的能自动读取用户的照片吗?最近做了一个小实验,我开发了2个小App,这2个App安装的时候只授予了相册权限,没有授予其他任何权限…...

2025年05月29日Github流行趋势
项目名称:agenticSeek 项目地址url:https://github.com/Fosowl/agenticSeek项目语言:Python历史star数:11898今日star数:2379项目维护者:Fosowl, steveh8758, klimentij, ganeshnikhil, apps/copilot-pull-…...

第十一节:第一部分:正则表达式:应用案例、爬取信息、搜索替换
正则表达式介绍 String提供的正则表达式的方法的书写规则 正则表达式总结 正则表达式作用: 作用三:搜索替换 案例分析及代码(图片解析) 代码: 代码一:校验手机号和邮箱格式是否正确 package com.itheima.…...
跟我学c++中级篇——动态库的资源处理
一、动态库的资源管理 动态库在编程中几乎是一个无法绕过的问题,不管是在哪个平台上都一样。在前面的文章中分析知道,编程的一个核心目标就是对计算机的资源进行管理和控制。动态库编程做为一个重要的技术,同样要面对资源的管理这个重要问题…...

新能源集群划分+电压调节!基于分布式能源集群划分的电压调节策略!
适用平台:MatlabYalmip Cplex (具体操作已在程序文件中说明) 参考文献:基于分布式能源集群化分的电压调节策略[D]. 一、文献解读 1. 主要内容/创新点 提出了一种基于分布式能源集群化的电压调节策略,计及分布式能源的有功、无功调节能力&a…...

端午安康 | 以匠心,致长远
端午节快乐 值此端午佳节,数图衷心感谢每一位合作伙伴与客户的信任相伴。 我们专注每一处细节,如粽米般紧密凝聚; 我们携手共进共赢,似龙舟竞渡般齐心协力。 未来,我们愿继续以创新为桨,与您共划时代新篇…...

漫画Android:事件分发的过程是怎样的?
当用户触摸屏幕时,硬件层会捕获触摸信号,并将其转化为内核事件。 Android系统会通过InputManagerService和WindowManagerService等服务将这些事件包装成MotionEvent对象,并将其传递给Activity的dispatchTouchEvent()方法中,Activi…...

2022 RoboCom 世界机器人开发者大赛-本科组(省赛)解题报告 | 珂学家
前言 题解 2022 RoboCom 世界机器人开发者大赛-本科组(省赛)。 感觉T5是最简单的,其他都不好做。 RC-u5 树与二分图 分值: 30分 思路: 容斥原理 树天然就是二分图,按深度d归类(偶数深度为S1,奇数深度为S2)&#x…...
什么是MCP技术,跟http技术有什么区别
什么是MCP技术? MCP(Model Context Protocol,模型上下文协议)是一种开源协议,旨在标准化大型语言模型(LLM)与外部数据源和工具之间的集成方式。 核心功能 上下文管理:保存对话历史…...

如何用ChatGPT提升学术长文质量
目录 一、关于让人工智能充当评审专家 二、关于分批次输入论文内容 三、来看看提示词 大家好这里是学术Anan,官网👉AIWritePaper~ 论文完成初稿之后,一般情况下,宝子们还需要找专家给我们提出评审意见。找专家评审其实并不容易…...

BKP(备份寄存器)和 RTC(实时时钟)
什么是BKP? 备份寄存器(BackupRegister)是42个16位的寄存器(不同设备存在差异:20字节(中容量和小容量)/84字节(大容量和互联型)),可用来存储 最多…...
springboot配置cors拦截器与cors解释
文章目录 cors?代码 cors? CORS(跨域资源共享)的核心机制是 由后端服务器(bbb.com)决定是否允许前端(aaa.com)的跨域请求 当浏览器访问 aaa.com 的页面,并向 bbb.com/list 发起请求时&#…...