Qt 创建的C++ 桌面程序 学习笔记1
Qt开发的C++桌面程序
Qt 是一个基于 C++ 的跨平台 GUI 框架,用于开发桌面应用程序,Qt 强调跨平台和性能。
Qt 是跨平台的王者,支持 Windows、Linux、macOS、Android 和嵌入式系统等多个平台。这意味着用 Qt 开发的 C++ 应用可以几乎无缝移植到不同操作系统,而无需重写大量代码。对于需要多平台部署的企业级应用(如科学计算工具或游戏编辑器),这是一大亮点。
- Qt 是一个跨平台的应用程序框架,提供:
- GUI 开发:
QWidget
、QMainWindow
、QML
(用于现代 UI)。 - 核心功能:信号槽机制(替代回调)、容器类(
QList
/QMap
)、文件 I/O(QFile
)、网络(QTcpSocket
)。 - 工具链:
qmake
/CMake
(构建)、Qt Designer
(UI 设计)、MOC
(元对象编译器)。
- GUI 开发:
- Qt 依赖 C++ 运行时(CRT):
- Qt 本身是 C++ 库,编译后的程序仍需链接系统的 C++ 运行时(如 Windows 的
msvcp140.dll
)。
- Qt 本身是 C++ 库,编译后的程序仍需链接系统的 C++ 运行时(如 Windows 的
-
Qt 是应用层框架,而 CRT 是语言运行时基础库。Qt 的功能更接近 C# 中的 .NET Framework(提供高级API)。
- Qt 依赖 CRT,编译 Qt 程序时,仍需链接 C++ 标准库(如
libstdc++
)和操作系统 CRT。例如在 Windows 上,Qt 程序会依赖vcruntime140.dll
。 - 替代关系 在 C++ 中的
libc
(Linux)或msvcrt.dll
(Windows)相当于C# 中的 CRT。Qt 的等价物在 C# 中是 .NET Framework 的类库(如System.Windows.Forms
或WPF
)。
Qt开发的C++桌面程序相对于C# WinForm/WPF的详细对比
性能、跨平台能力、开发效率、生态系统、部署成本。尤其要强调Qt的“一次编写多平台编译”和C#的“跨平台重写”本质区别
核心对比总览
特性维度 | Qt (C++) | C# (WinForms / WPF) | 胜出方 / 说明 |
---|---|---|---|
性能与资源控制 | 极高。编译为原生代码,运行效率接近硬件极限。内存、CPU周期完全由开发者掌控。 | 高(WPF) / 较高(WinForms)。基于JIT编译,性能通常足够好,但不如C++极致。受限于GC。 | Qt (C++) 适用于性能敏感型应用。 |
跨平台能力 | 顶级。一次编写,随处编译。完整支持Windows, Linux, macOS, 甚至嵌入式系统。 | 有限。WinForms/WPF 本身仅限Windows。可通过 MAUI (不成熟) 或 Avalonia (第三方) 实现跨平台。 | Qt (C++) 真正的原生跨平台。 |
语言与学习曲线 | C++:强大但复杂,学习曲线陡峭。需手动管理内存,但RAII和智能指针缓解了问题。 | C#:现代、优雅,学习曲线平缓。自动内存管理(GC),开发效率高。 | C# 更易上手,开发更快速。 |
UI现代化与灵活性 | 灵活。Qt Widgets:传统桌面样式,性能好。 QML:声明式语言,支持非常现代、炫酷的UI和动画,适合触摸设备。 | WPF:基于DirectX,支持矢量图形、丰富动画和数据绑定,非常强大。 WinForms:简单、成熟,但UI略显过时,定制复杂控件较难。 | 平局 WPF/QML都很强,取决于设计师和开发者水平。 |
开发工具与体验 | 良好。Qt Creator 轻快高效。VS插件体验也很好。调试C++比C#更复杂。 | 极佳。Visual Studio 是宇宙级IDE,提供无与伦比的调试、拖拽设计、智能提示体验。 | C# 凭借Visual Studio胜出。 |
生态系统与依赖 | 自包含。通常只需打包几个Qt的DLL。依赖少,部署相对简单。 | 依赖.NET。需为目标机器安装对应版本的.NET Framework或.NET运行时。 | Qt (C++) 部署依赖性更小。 |
社区与就业市场 | 活跃。主要集中在嵌入式、工业自动化、汽车、专业软件领域。 | 极其庞大。主要集中在企业应用、业务系统、Windows内部工具开发。 | C# .NET社区规模更大。 |
许可证 | 双许可。开源版(LGPL/GPL)或商业许可。LGPL要求动态链接,或修改Qt源码需开源。 | 完全免费。.NET SDK和Visual Studio Community版均可免费商用。 | C# 许可证更简单无忧。 |
🔍 各维度详细解读
1. 性能与资源控制 (Performance & Control)
C++ 作为底层语言,Qt 应用在执行速度和内存管理上通常更高效,尤其适合资源密集型应用(如实时图形渲染或大型数据处理)。Qt 使用 OpenGL 或 Vulkan 等现代渲染引擎,支持硬件加速,且在低端硬件上表现更好。相比 WinForms,Qt 的性能提升显著;在与 WPF 对比时,Qt 的原生 C++ 代码避免了 .NET 的运行时开销。但时,C++ 的手动内存管理和潜在的指针错误可能导致调试更复杂,如果开发者不熟练,会影响整体性能优化。
- Qt (C++):这是它的核心优势。编译后的代码直接运行在硬件上,没有中间层。你可以进行极致优化,精确控制内存分配和释放(虽然Qt本身也有少量开销)。这对于需要榨干硬件性能的软件至关重要,例如:
- 工业控制软件(高实时性)
- 视频/图像处理软件(如Adobe Photoshop、DaVinci Resolve底层)
- 大型科学计算与仿真
- 游戏引擎编辑器(如Unity Editor早期版本)
- 嵌入式设备上的GUI
-
C# (WinForms/WPF):启动快,适合简单应用。基于.NET,性能对于绝大多数业务应用(ERP、CRM、管理系统)来说绰绰有余。JIT编译使其速度很快,WPF的图形渲染由DirectX加速,非常流畅。但其性能上限受制于垃圾回收(GC),在需要极低延迟的场景下,不可控的GC暂停可能是个问题。
2. 跨平台能力 (Cross-Platform)
- Qt (C++):真正的跨平台王者。你写的同一份C++代码,只需在目标平台上用对应的编译器重新编译,就能生成原生应用。这是Qt的立身之本。如果你的目标用户群使用Windows、Linux和macOS,且你希望为每个平台提供原生的外观和体验,Qt是首选。
- C# (WinForms/WPF):本质上是Windows技术。虽然.NET Core/.NET 5+ 是跨平台的,但WinForms和WPF这两个UI框架本身并不是。微软的跨平台解决方案是MAUI,但它更侧重于移动端,且成熟度和社区生态远不如Qt。第三方框架AvaloniaUI非常优秀,模仿了WPF的API并实现了跨平台,但它仍然是一个需要额外学习和依赖的框架。
3. 开发效率与体验 (Development Experience)
- C# (WinForms/WPF):绝对优势。Visual Studio提供了世界上最好的开发体验之一:
- 强大的拖拽设计器:快速搭建UI。
- XAML热重载:实时查看WPF界面更改效果。
- 一流的调试器:易于使用。
- NuGet包管理:海量库一键集成。
- C#语言特性:
async/await
、LINQ等特性让编写复杂逻辑变得非常高效。
- Qt (C++):开发体验也很不错,尤其是使用Qt Creator时。但对于大型复杂项目,Visual Studio的优势更大。Qt提供了Qt Designer用于拖拽设计UI,但其体验略逊于VS。C++的编译速度通常慢于C#,这也会影响迭代效率。Qt的信号槽机制虽然强大,但语法上不如C#的
event
和delegate
直观。
4. 应用场景与总结 (Use Cases & Conclusion)
跨平台专业软件音视频处理嵌入式设备GUI工业控制/HMI企业内部工具业务管理系统/ERP低性能要求高性能要求Windows Only跨平台需求Qt vs C# 技术选型决策图
如何选择?
- 选择 Qt (C++) 如果:
- 你的应用是性能敏感型或资源极度受限。
- 你有强烈的跨平台需求,希望为Windows、Linux、macOS提供完全原生的体验。
- 你的目标领域是嵌入式、工业自动化、专业音视频处理等。
- 你的团队精通C++,并且对底层控制有要求。
- 选择 C# WinForms/WPF 如果:
- 你的应用是典型的Windows企业级应用(如管理系统、后台工具、数据展示)。
- 开发速度、上市时间和开发体验是你的最高优先级。
- 你的团队主要使用Windows,且对C#和.NET生态系统更熟悉。
- 应用不需要部署到Linux或macOS。
5.开发效率和学习曲线
Qt 的优势:Qt Designer 提供可视化拖拽设计,支持信号-槽机制简化事件处理。C++ 开发者可以轻松集成现有 C++ 后端代码(如科学库),无需语言切换。对于有 C++ 经验的团队,Qt 的工具链(如 Qt Creator IDE)非常强大。
Qt 的劣势:C++ 语言本身更复杂(无垃圾回收,手动管理资源),学习曲线陡峭,尤其是对初学者。Qt 的 API 庞大,初次上手需时间;相比 C#,调试和迭代周期更长。
6.社区支持、生态和未来性
Qt 的优势:活跃的开源社区,大量第三方库(如集成 OpenCV 或 TensorFlow),商用支持强劲。未来性好,随着跨平台需求增长,Qt 持续更新。
Qt 的劣势:社区不如 .NET 大,C++ 资源较少。
Qt (C++) 的核心优势在于跨平台和高性能,适合需要多 OS 支持或 C++ 后端的复杂应用(如工程软件),但学习曲线和开发速度是劣势。WinForms (C#) 简单高效,适合 Windows 专属的快速开发,但 UI 和性能已落后。WPF (C#) 是现代 Windows 应用的首选,提供最佳 UI 能力和生产力,但缺乏跨平台性。如果你优先 Windows 且追求现代感,选择 WPF;若需跨平台,Qt 是更好选项。最终选择取决于项目需求、团队技能和目标平台。
一句话总结:Qt 用于需要极致性能、控制力和跨平台能力的“硬核”软件;C# 用于追求开发效率和体验的Windows商业应用。
Qt的各个版本的区别
了解Qt与跨平台开发,全面包括Qt各个版本特性及应用场景_qt 版本-CSDN博客
Qt 各主要版本(Qt 4、Qt 5、Qt 6)在架构、特性和适用场景上有所不同。下面是一个表格汇总了它们的核心差异,方便你快速了解:
特性维度 | Qt 4 (2005-2015) | Qt 5 (2012-2020) | Qt 6 (2020至今) |
---|---|---|---|
图形渲染 | 基于 OpenGL,能力基础 | Qt Quick 2.0 基于 OpenGL | Qt RHI (渲染硬件接口),支持 Vulkan/Metal/D3D |
C++标准支持 | 缺乏现代 C++ 支持 | C++11 | C++17 及以上 |
主要GUI范式 | Qt Widgets | Qt Widgets (维护) + Qt Quick/QML (引入并强化) | Qt Widgets (维护) + Qt Quick/QML (进一步现代化,增强3D能力) |
构建系统 | qmake | qmake (主要), CMake (开始引入) | CMake (为主) |
关键新特性 | 模块化架构, MVC, QtWebKit | 增强的跨平台支持(Android/iOS), Qt WebEngine (基于Chromium), 更丰富的模块 | 强类型QML, 更好的高DPI支持, Qt Shader Tools, 大量API清理和现代化 |
性能重点 | 稳定,但渲染性能和效率有限 | 桌面和移动端性能提升,QML性能优化 | 图形渲染效率显著提升,跨平台硬件加速 |
主要局限 | 移动和嵌入式支持弱,遗留代码多 | 仍受 OpenGL 限制,Qt Widgets 改进有限 | 移除部分过时API,兼容性调整较大 ;对操作系统版本要求更高 (如 Win10+ ) |
典型应用场景 | 传统桌面应用,经典嵌入式系统(部分老设备) | 跨平台桌面应用、移动应用(Android/iOS)、嵌入式Linux | 高性能要求的现代应用、3D UI、移动应用、利用现代图形API的嵌入式系统 |
Qt 的常用模块
📦 一、Qt 基本模块 (Essentials Modules)
这些模块是 Qt 的核心,在所有支持的平台上都可用,是绝大多数 Qt 应用程序的基础。
模块名 | 描述 |
---|---|
Qt Core | 核心非 GUI 类。是所有其他模块的基础,包括信号槽、对象模型、线程、文件 I/O、容器类等。 |
Qt GUI | 图形用户界面的基础类。包括 OpenGL 集成、字体、图像、调色板等。更高级的 UI 模块都构建于此。 |
Qt Widgets | 基于 C++ 的传统桌面风格 UI 控件。提供按钮、列表、对话框等大量可定制控件,用于构建经典桌面应用。 |
Qt Network | 网络编程类。简化 TCP/IP 和 UDP 客户端和服务器程序的开发,支持 SSL 加密。 |
Qt SQL | 数据库集成类。提供到 SQL 数据库的驱动和操作接口,支持主流数据库(MySQL, PostgreSQL, SQLite 等)。 |
Qt Test | 单元测试框架。用于编写 Qt 应用程序和库的单元测试。 |
🧩 二、Qt 附加模块 (Add-On Modules)
这些模块提供特定领域的额外功能,可能需要根据许可证单独选择,或在安装时勾选。
1. 图形与用户界面 (Graphics & UI)
模块名 | 描述 |
---|---|
Qt QML | 用于构建动态、自定义用户界面的声明式框架。使用 JavaScript 作为逻辑脚本。 |
Qt Quick | QML 的标准库和运行时。提供用于构建现代动画触摸式 UI 的基本类型和功能(如 Rectangle , Text )。 |
Qt Quick Controls 2 | 基于 Qt Quick 的轻量级、高性能 UI 控件集。提供接近原生风格的按钮、列表等控件,适合移动和嵌入式设备。 |
Qt Quick 3D | 用于创建 3D 内容和 3D 用户界面的高级 API。 |
Qt ShaderTools | 跨平台着色器工具,用于管理着色器在不同图形 API 上的移植性。 |
2. 多媒体 (Multimedia)
模块名 | 描述 |
---|---|
Qt Multimedia | 音频、视频、摄像头和收音机功能的 API。 |
Qt PDF | 用于显示和操作 PDF 文档的类和工具。 |
3. 通信与连接 (Connectivity)
模块名 | 描述 |
---|---|
Qt Bluetooth | 提供蓝牙功能的 API,用于在不同平台间连接蓝牙设备。 |
Qt SerialBus | 工业总线协议的实现,如 CAN、Modbus。 |
Qt SerialPort | 提供对硬件串口(RS-232/485)的访问。 |
Qt MQTT | 实现 MQTT 协议,用于物联网(IoT)消息传递。 |
Qt NFC | 提供对近场通信(NFC)功能的访问。 |
Qt WebChannel | 在 Qt 应用程序(C++/QML)和 Web 内容(HTML/JS)之间建立对等连接。 |
Qt WebSockets | 实现 WebSocket 协议(RFC 6455)。 |
4. 语言与工具 (Language & Tools)
模块名 | 描述 |
---|---|
Qt Linguist | 一套用于应用程序国际化的工具。使应用程序的翻译变得简单。 |
Qt Script (已弃用) | 提供脚本化功能,但已被 QML 和 Qt QML 模块取代。 |
Qt Help | 用于在应用程序中集成在线帮助文档。 |
5. 其他重要模块
模块名 | 描述 |
---|---|
Qt Concurrent | 高级多线程编程库。使用高阶函数(如 map , filter , reduce )并行处理列表,无需使用低级的线程原语。 |
Qt PrintSupport | 提供对打印功能的支持。 |
Qt Xml / Qt XML Patterns | 处理 XML 数据的模块(部分功能已被 Qt Core 中的 QXmlStreamReader/Writer 取代)。 |
Qt Sensors | 提供对硬件传感器(如加速度计、陀螺仪)的访问。 |
Qt Positioning | 提供位置信息来源(如 GPS, Wi-Fi)的访问。 |
Qt StateMachine | 提供创建和执行状态机的框架。 |
Qt Charts | 用于创建美观的 2D 图表(折线图、饼图、条形图等)。 |
Qt Data Visualization | 用于创建 3D 数据可视化(如柱状图、散点图)。 |
Qt Gamepad | 允许应用程序接收游戏手柄输入事件。 |
Qt环境下MSVC和MinGW编译器的文件区别
MSVC
编译器(Microsoft Visual C++)。这是Visual Studio自带的编译器。
mingw_64 是
MinGW
编译器(Minimalist GNU for Windows)构建的。
MSVC
和 MinGW
是两种不同的编译器工具链,它们编译产生的二进制库文件是不兼容的。Visual Studio的Qt插件在检测到你试图将一个MinGW
构建的Qt版本
特性 | MSVC (Microsoft Visual C++) | MinGW (Minimalist GNU for Windows) |
---|---|---|
目标文件 | .obj (COFF格式) | .o |
静态库 | .lib | .a |
动态库 | .dll + 配套的.lib (导入库) | .dll + 配套的.dll.a (导入库) |
运行时依赖 | Microsoft Visual C++ Redistributable包 或 MSVCRT.dll 等 | libstdc++-6.dll , libgcc_s_dw2-1.dll , winpthreads 等GNU库 |
调试信息 | .pdb (Program Database) | .debug 或嵌入DWARF信息 |
兼容性 | 需使用MSVC编译的第三方库 | 需使用MinGW编译的第三方库 |
🔧 选择建议:
- 优先选择 MSVC 的情况:
- 开发仅面向Windows平台的应用程序,尤其是需要深度集成Windows特有API(如COM、DirectX)或追求最佳性能的项目
- 需要使用Visual Studio强大的图形化调试器进行复杂调试
- 项目依赖的第三方库仅提供MSVC编译版本(例如许多官方Windows SDK)
- 优先选择 MinGW 的情况:
- 需要跨平台开发(Windows、Linux、macOS),希望源码能在不同系统上编译通过,注重平台兼容性
- 项目依赖的第三方库来源于GNU生态或主要提供MinGW编译版本
- 希望使用完全开源免费的工具链,或更熟悉GCC系列编译器的选项和特性
组件 | 说明 |
---|---|
MSVC | 针对 Windows 平台上的 MSVC 编译器的 Qt 组件,如 msvc2019 32-bit 和 msvc2019 64-bit 等。安装该组件需要计算机上已经安装相应版本的 Visual Studio。 |
MinGW | 编译器模块。MinGW 是 Minimalist GNU for Windows 的缩写,是 Windows 平台上使用的 GNU 工具集导入库的集合。 |
UWP | UWP 是 Windows 10 中 Universal Windows Platform 的简称,有不同编译器类型的 UWP,属于 MSVC 编译器生成的 Qt 库。如果不是开发 UWP 应用程序,就不需要,直接忽略。 |
Android | 这是针对安卓应用开发的 Qt 库,一般情况下用不到。 |
Sources | Qt 的源代码包,除非你想阅读 Qt 的源码,否则不用安装。 |
Qt | Qt 的附加模块。括号里的 TP 是指 Technology Preview,技术预览模块的意思,还处在功能测试阶段,不是正式版模块;括号里的 Deprecated 是指抛弃的旧模块,兼容旧代码使用的,一般用不到(如果不是为和以前开发的源程序兼容,过时的模块不要选择)。 |
安装QT
进入清华大学开源软件镜像站下载:
https://mirrors.tuna.tsinghua.edu.cn/qt/official_releases/online_installers/
一步步安装
VisualStudio 2022中安装Qt Vs Tools
在 Visual Studio 的 扩展 -> 管理扩展 中在线搜 Qt Visual Studio Tools
配置 Qt 版本
Qt 框架:从 Qt 官网下载并安装。对于 Windows 上的 Visual Studio 开发,安装时请选择与你 Visual Studio 版本匹配的 MSVC 编译器组件(例如,对于 VS2022,可选择 msvc2019_64
或查询 Qt 官网以确认兼容的版本)
- 启动项目创建 打开 Visual Studio,选择 “文件” > “新建” > “项目”
- 选择项目模板 “Qt Widgets Application”(适用于传统桌面GUI)或其他Qt项目类型
- 配置 Qt 版本项目创建过程中或之后,会提示你选择要使用的 Qt 版本。从下拉菜单中选择你已安装并通过 “扩展 -> Qt VS Tools -> Qt Options” 配置好的 Qt 版本。
- QT项目中文件类型
YourProjectName/
├── main.cpp // 应用程序主入口
├── MainWindow.h // 主窗口类头文件
├── MainWindow.cpp // 主窗口类实现文件
├── MainWindow.ui // 主窗口UI文件(可用Qt Designer编辑)
└── YourProjectName.pro // Qt项目文件(qmake)
- 双击
.ui
文件即可在集成的 Qt Designer 中通过拖放控件设计界面 - 在
MainWindow.h
和MainWindow.cpp
等文件中编写业务逻辑和功能代码