【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客户端开发的重要任务:编写和用户交互的界面

在用户交互的界面:由两种典型风格构成:

  1. 命令行界面/终端界面(黑框框)TUI,常给程序员使用的专业软件
  2. 图形化界面 GUI 给普通用户使用(也就类似我们常用的windows环境)

而Qt就是用来编写 GUI程序的一套框架~~

在Windows编写GUI程序,有很多种方法,其中QT只是其中之一,windows下还有那些方案可以开发GUI:

  1. Windows API 系统原生提供的API,开发起来非常原始和繁琐(最简单古老的方式)
  2. MFC:使用了面向对象的方式,将Windows API接口进行封装使用(它的影响非常深远)
  3. QT:(1991年左右诞生)其中它和MFC类似同样的都是通过封装的方式写成
    • 但MFC早就不更新了,而QT仍然在不断推陈出新
  4. GTK、WxWidget
  5. Windows Forms:一个给C#给量身定做的一套GUI技术体系(微软的编程语言 C#(C sharp))
  6. WPF、UWP(Windows Forms的升级版)
  7. 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 的优点

  1. 跨平台,⼏乎⽀持所有的平台;
  2. 接⼝简单,容易上⼿,学习 QT 框架对学习其他框架有参考意义。
  3. ⼀定程度上简化了内存回收机制(半自动的垃圾回收,简化内存释放,尽可能小的影响程序的效率)
  4. 开发效率⾼,能够快速的构建应⽤程序。
  5. 有很好的社区氛围,市场份额在缓慢上升。
  6. 可以进⾏嵌⼊式开发

Qt 的应⽤场景

  • 桌⾯应⽤程序
    Qt 能够创建各种类型的桌⾯应⽤程序,包括⽂件管理器、媒体播放器、绘图程序等。Qt 应⽤程序⽀持多种操作系统,可以运⾏在 Windows、Linux、macOS 等桌⾯操作系统上
  • 移动应⽤程序
    Qt ⽀持 Android 和 IOS 移动操作系统,为应⽤程序提供了强⼤的跨平台能⼒。可以使⽤ Qt 构建各种移动应⽤程序,例如社交应⽤、游戏、娱乐等
  • 嵌⼊式系统
    Qt 在嵌⼊式领域应⽤⾮常⼴泛,它可以构建⾯向各种设备的图形应⽤程序,在机顶盒、⻋载娱乐系统、安防监控设备等领域具有⼴泛的应⽤

开发的知名软件:
剪映、WPS Office 办公软件、Google Earth ⾕歌地图 、VirtualBox 虚拟机软件…

3. Qt 开发环境的搭建

需要安装3个部分:

  1. C++编译器(gcc/cl.exe,并不是Visual Studio不是IDE,编译器只是IDE调用的一个程序)
  2. Qt SDK(SDK 软件开发包)windows版本 Qt SDK里已经内置了 C++ 编译器(内置编译器是mingw,windows版本的gcc/g++)
  3. 需要有个 Qt 的集成开发环境(IDE)
    1. Qt Creator(Qt官方提供的,最容易入门,上手的方式,开箱即用不用怎么配置)虽然过程中存在许多bug 但整体来说挺方便
    2. Visual Studio(功能更强,但需要配置容易出错)
    3. Eclipse(并非只是Java IDE,本身是一个IDE平台可以搭配不同插件构成不同的IDE,但目前市场份额冲击很大 JetBrain、VSCode)
  • 本质只用安装一个 Qt SDK,另外两个就有了

下载Qt SDK:

去官方网站(下载一个安装程序,首选官方网站)
Qt 的官方网站(下载5.14的一个版本相对于不算很新也不老):(国外网站可能速度较慢,想办法fq)

4. Qt Creator安装过程

  1. 关闭网络跳过注册
  2. 选择路径(安装软件所在目录常识:不要代中文、特殊符号以及空格)
  3. 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中进行添加该目录:
    在这里插入图片描述

配置环境变量是为了:

  1. 让操作系统 Qt Creator 工具 ,能够找到Qt SDK 中提供的exe
  2. 运行 Qt 程序的时候,能够找到 .dll 动态库(Windows环境中)
  3. 环境变量简单的理解成:“进程间通信” 机制(让一个进程借助环境变量找到另外一个进程)

在这里插入图片描述

对于安装成功后会有5个程序他们分别是:

  1. Assistant:离线官方文档,也就是存储许多的函数的使用方法(英文文档要有耐心)
  2. Designer:Qt 设计师,图形化的设计界面的工具,拖拽式的快速生成界面(后面经常使用,但是是搭配 Qt Creator来使用)
  3. Linguist:Qt 语言家,作用是对国际化进行支持,有点时候写的程序,要和国际接轨(允许单独创建一个 语言配置文件,把界面需要用到的各种文字,都配置到文件中,并且在文件中提前把各种一样的翻译配置进去)就可以通过简单的 api 切换这里的语言配置
  4. Qt 5.14.2:Qt 的命令行
  5. Qt Creator:Qt 的集成开发根据(学习Qt 过程中最主要的工具)

5. 初始创建Qt项目

  1. 打开QT Creator
  2. 打开右上角的文件选择新建(应用程序)
    1. 在选择Application
    2. Qt Widgets App…
    3. Qt 不仅支持C++、也支持 Python 和 Java
      在这里插入图片描述
      在这里插入图片描述
  3. 我们本处只涉及第一个 Qt Widgets 选择后继续
    1. 填写名称
    2. 路径
    3. 下一步
      在这里插入图片描述
  4. 构建系统,通过Qt写的程序,涉及到一系列的 元编程技术(通过代码来生成代码)
    1. Qt 框架会在编译的时候,自动先调用一系列根据,基于你自己的代码,生成一系列的其他的 C++ 代码,最终编译的代码
    2. 其中 qmake 是老牌的Qt构建工具(默认选择qmake使用即可
    3. CMake 并非Qt专属,很多的开源项目都会使用CMake
  5. 其中关注:Base Class:使用Qt Creator 创建项目,会自动的生成一些代码
    在这里插入图片描述
    1. 生成的代码就包含一个类
    2. 此处就是要选择这个自动生成的类的父类
    3. 此处先选择QWidget进行学习
    4. 其中 Class name 就是自己生成的类Base class 就是父类
      在这里插入图片描述
    5. Qt 中内置的类都是以Q开头
    6. 而下面的就是文件名,他和上面的类是关联的(其中可以不一样,但经量保持一致)
    7. Form file 非常关键: Qt中创建图形化界面的程序,有两种方式
      1. 直接通过c++代码的方式创建界面
      2. 通过form file文件,以图形化的方式来生成界面(此时就可以使用Qt Designer 或直接使用Qt Creator 来编辑这个 ui 文件,从而以图形化的方式,快速方便的生成图形化界面)
  6. 这里是选择 翻译文件(对应的语言)暂时不关注,它是和国际化相关的
    在这里插入图片描述
  7. 选择一下基于那个编译器的Qt SDK 来构建后续代码
    1. 就默认勾选 WinGW 就可以了
      在这里插入图片描述
  8. 可以选择版本控制工具(如git…)
    在这里插入图片描述
  9. 最终完成就创建好了
  • 当创建好后,在左下角有运行按钮(绿色三角):
    在这里插入图片描述
    • 其中注意我们创建项目过程中的存储路径,不要有中文路径!!
    • 最终就会构建出一个图形化界面:
      在这里插入图片描述

6. 认识界面及细节

在构建成功后,会自动生成main函数:

  • 其中main函数中有:

    1. 必备的 QApplication对象
    2. Widget对象,根据对象就是我们创建项目时选择的QWidget
      在这里插入图片描述
  • 构建后会生成,Widget.h类

    1. 其中Q_OBJECT 是一个Qt内置的宏(宏的本质上就是文本替换)
      • Q_OBJECT展开之后,就会生成一大堆代码
      • Qt中有一个非常核心的机制,“信号” 和 “槽”
      • 如果这个类想使用 信号和槽 就需要引入这个宏!
    2. 其中构造函数中的 parent 参数:
      • 是一个引入的“对象树”机制(后续细讲)
      • 创建的Qt对象给挂到对象树(N叉数)上
      • 往树上挂的时候就需要指定 “父节点”
    3. UI::Widget* ui
      • 它和 Form file 密切相关
  • widget.cpp
    在这里插入图片描述

  • form file

    • 当我们双击 ui 文件,此时 Qt Creator 就会调用Qt Designer,打开UI文件,图形化的界面编辑器
      在这里插入图片描述
    • 此时在点击左侧的编辑按钮,就会 显示 ui 文件的本题
    • 这个格式 也就是 xml 格式(和html类似,都是使用成对的标签来表示数据)
    • xml 这里的标签,有那些标签有什么含义,都是程序员自己定义的(也就是qt开发的大佬们定义的),只用知道 ui 文件本质就是一个xml即可
    • 类似的就是自定义应用层协议
    • Qt 中使用 xml文件就是描述程序的界面是啥样的,进一步的qmake会调用相关的工具,依据这个xml文件生成一些c++代码,从而把完整的界面构造出来
      在这里插入图片描述
  • .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细致内容,早关注不迷路。

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

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

相关文章

AI应用 Markdown 渲染对比与原生实现方案

DeepSeek、豆包、腾讯元宝、ChatGPT 渲染实现对比表 产品解析方式渲染引擎/库UI 组件架构Markdown支持范围流程图/导图支持扩展架构及裁剪流式解析渲染DeepSeek原生解析(非WebView)采用 CommonMark 标准解析器(推测使用 Markwon 库&#xff…

Ubuntu20.04系统安装,使用系统盘安装

1、系统安装 Ubuntu20.04系统安装,使用系统盘安装 查看ubuntu系统版本 lsb_release -a:显示发行版名称、版本号及代号 (base) rootai-System-Product-Name:/media/ai/wh/clash-for-linux-master# lsb_release -a No LSB modules are available. Distri…

(自用)Java学习-5.19(地址管理,三级联动,预支付)

1. 地址管理模块 地址展示 前端:通过 showAddress() 发起 Ajax GET 请求,动态渲染地址列表表格,使用 #{tag}、#{name} 等占位符替换真实数据。 后端: 控制器层调用 AddressService,通过 AddressMapper 查询用户地址数…

Spring 循环依赖:从原理到解决方案的全面解析

Spring 循环依赖:从原理到解决方案的全面解析 一、循环依赖的定义与分类 1. 什么是循环依赖? 在 Spring 框架中,循环依赖指的是多个 Bean 之间形成了依赖闭环。例如: Bean A 依赖 Bean BBean B 依赖 Bean CBean C 又依赖 Bean…

n 阶矩阵 A 可逆的充分必要条件是 ∣ A ∣ ≠ 0

n 阶矩阵 A 可逆的充分必要条件是 ∣ A ∣ ≠ 0 |A| \neq 0 ∣A∣0 的几何意义 1. 行列式的几何意义回顾 行列式 ∣ A ∣ |A| ∣A∣(或 det ⁡ ( A ) \det(A) det(A))表示矩阵 A A A 所对应的线性变换对空间的体积缩放因子: ∣ A ∣ &…

Rockey Linux 安装ffmpeg

1.环境准备 Rockey linux 9.2 ffmpeg 静态资源包 这个是我自己的: https://download.csdn.net/download/liudongyang123/90920340https://download.csdn.net/download/liudongyang123/90920340 这个是官网的 Releases BtbN/FFmpeg-Builds GitHub 以上两个资…

wordcount在集群上的测试

1.将louts.txt文件从cg计算机复制到master节点上面,存放在/usr/local/hadoop 需要输入密码:83953588abc scp /root/IdeaProjects/mapReduceTest/lotus.txt root172.18.0.2:/usr/local/hadoop /WordCountTest/input 2.将lotus.txt文件从master这台机器…

AI+制造:中小企业的低成本智能化转型

文章内容过长,可以考虑直接跳转到文章末尾查看概要图 在制造业竞争日益激烈的今天,中小企业正面临着前所未有的挑战:人力成本持续攀升、能源消耗居高不下、质量控制难度增加。与此同时,数字化转型已成为行业共识,但高…

Linux C/C++编程 —— 线程技术总结

一、线程基本概念 线程是进程内的一个执行单元,多个线程共享进程的资源(如内存、文件描述符等),但每个线程拥有自己的寄存器、栈等。与进程相比,线程的创建、切换开销较小,能更高效地利用 CPU 资源。 二、…

Femap许可证与网络安全策略

随着科技的快速发展,网络安全问题已成为各行各业关注的焦点。在电磁仿真领域,Femap作为一款领先的软件,其许可证的安全性和网络策略的重要性不言而喻。本文将探讨Femap许可证与网络安全策略的关系,确保您的电磁仿真工作能够在一个…

深度解析:SQLynx 如何筑牢数据库安全防线​

在数据驱动业务发展的时代,数据库作为企业核心资产的 “保险箱”,其安全性至关重要。一旦数据库遭遇攻击、数据泄露或被误操作,将给企业带来不可估量的损失。而 SQLynx 作为一款专注于数据库安全管理的工具,凭借其多项创新技术与功…

更新时间相差8个小时

下面的java代码在updateFill方法里面生成的modifiedTime时间是当前时间是正确的,为什么到service层testCommonFieldAutoUpdate方法里面去更新的时候modifiedTime就差8个小时呢?代码如下所示: Slf4j Component public class MpMetaObjectHand…

Windows逆向工程提升之IMAGE_TLS_DIRECTORY

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 目录 TLS的作用 TLS的实现 静态 TLS​​ 动态 TLS​​ 内部实现 回调机制 TLS Directory 的结构 TLS的作用 TLS (Thread Local Storage) 是一种用于为多线程应用程序提供线程独立存储空…

云效流水线Flow使用记录

概述 最近在频繁使用阿里云云效的几款产品,如流水线。之前写过一篇,参考云效流水线缓存问题。 这篇文章来记录更多问题。 环境变量 不管是云效流水线Flow还是应用交付AppStack(基于流水线,后文不再赘述)&#xff0…

Android中获取控件尺寸进阶方案

在Android开发中,很多场景都需要获取控件(View)的宽高信息,比如动态布局调整、动画效果实现等。然而,直接在Activity的onCreate()中调用控件的getWidth()或getHeight()`方法,得到结果却是0,因为控件还没完成布局测量。 本文总结了几种获取控件大小的实用方法,并对各方…

android 输入系统

一、输入系统的核心角色与分层架构 Android 输入系统的本质是桥梁:一端连接硬件驱动产生的原始事件,另一端将事件精准派发给应用窗口。整个过程涉及三层架构和多个关键组件,可类比为 “快递分拣系统”: 1. 硬件与内核层&#xf…

ubuntu中,c和c+程序,预编译、编译、链接和运行命令

目录 安装编译器一.c编译运行(粗暴简单)1.编写 C 程序:2. 预处理:3.编译:4. 汇编:5. 链接:6.运行 二.c编译运行(粗暴简单)1.编写 C 程序:2.预处理&#xff1a…

【FastAPI】--2.进阶教程(一)

【FastAPI】--基础教程-CSDN博客 app.get和post的参数: 参数类型说明pathstr路由路径(如 "/marks"),必填。response_modelType[T]定义响应数据的模型(如 percent),会自动校验和序列…

KT6368A通过蓝牙芯片获取手机时间详细说明,对应串口指令举例

一、功能简介 KT6368A双模蓝牙芯片支持连接手机,获取手机的日期、时间信息,可以同步RTC时钟 1、无需安装任何app,直接使用系统蓝牙即可实现 2、同时它不影响音频蓝牙,还支持一些简单的AT指令进行操作 3、实现的方式&#xff1…

【平面波导外腔激光器专题系列】用于光纤传感的低噪声PLC外腔窄线宽激光器

----翻译自Mazin Alalusi等人的文章 摘要 高性价比的 1550 nm DWDM平面外腔 &#xff08;PLANEX&#xff09; 激光器是干涉测量、布里渊、LIDAR 和其他光传感应用的最佳选择。其线宽<3kHz、低相位/频率噪声和极低的RIN。 简介 高性能光纤分布式传感技术是在过去几年中开发…