用 Qt 6.x 构建工业级软件架构
方法、模式与实战
课程大纲 · 前言 · 完整知识体系
面向具备 C++ 基础的进阶开发者
2026年6月 · 于深圳
目录
课程定位说明
第一阶段:架构思维的基石···第 1 – 5 节
第二阶段:核心架构模式···第 6 – 12 节
第三阶段:工业设备层···第 13 – 18 节
第四阶段:可视化与交互层···第 19 – 24 节
第五阶段:交付、测试与运维···第 25 – 30 节
前言:为什么写这门课,以及你该怎么学
课程知识点全景
软件版本与环境说明
课程定位说明
课程定位 🎯 目标受众:具备 C++ 基础,希望从"能写 Qt 界面"跃迁到"能设计工业级软件架构"的进阶开发者 📐 组织方式:每节课按"核心方法 + 设计模式 + 实战编码"三段式组织 🏭 最终产出:一个完整的工业上位机系统作为结业作品 |
本课程不是一本 Qt API 参考手册,而是一套围绕"做一个真正能部署到工厂的工业上位机系统"这一总目标,有机组织起来的完整技能树。每一节既是独立的知识单元,也是构建终极项目的一块积木。
课程全景:五阶段递进架构
下表展示了课程五个阶段的完整架构,从思维基石到最终交付,层层递进。
阶段 | 课节范围 | 核心目标 | 关键知识点 | 篇幅 |
第一阶段 架构思维的基石 | 第 1–5 节 | 建立工业软件与普通桌面软件的本质区分意识;掌握 Qt 6.x 模块全景与选型策略;深入理解信号槽调度机制与多线程编程根基 | 架构演进脉络 · Qt 6.x 模块选型 · CMake 工程结构 · 信号槽深层机制 · QThread 正确用法 | 5 节(理论基础) |
第二阶段 核心架构模式 | 第 6–12 节 | 建立工业软件中反复出现的架构模式工具箱;理解每种模式解决什么痛点、在 Qt 中怎么实现、适用边界在哪里 | 任务调度与线程池 · 插件式架构 · Model/View 深度应用 · 命令模式/撤销框架 · 状态机与工作流 · 事件总线 | 7 节(模式实践) |
第三阶段 工业设备层 | 第 13–18 节 | 建立与真实硬件通信的工业级封装能力;从串口底层到 ModBus/CAN 协议栈到网络通信与数据持久化的完整链路 | 串口通信封装 · ModBus RTU/TCP · CAN 总线/J1939 · TCP/MQTT 网络 · 数据持久化 · 日志与可观测性 | 6 节(设备实战) |
第四阶段 可视化与交互层 | 第 19–24 节 | 掌握从 QPainter 自定义控件到 Qt Quick 3D 数字孪生的完整可视化技术栈;正确处理多屏、国际化等工业交互问题 | 自定义控件 · QML/C++ 混合编程 · Qt Quick 3D 数字孪生 · OpenGL 渲染 · 多屏管理 · 国际化 | 6 节(界面实战) |
第五阶段 交付、测试与运维 | 第 25–30 节 | 跨越从"写完代码"到"完成项目"的鸿沟:测试、CI/CD、OTA 升级、性能优化、最终交付结业项目 | 自动化测试 · CI/CD 流水线 · OTA 升级 · 远程运维 · 性能优化 · 结业项目交付 | 6 节(交付收尾) |
各阶段详细课节大纲
第一阶段:架构思维的基石
序号 | 课题 | 核心内容 |
第 1 节 | 工业软件的架构本质 | 从单体架构、分层架构到插件式架构的演进脉络。工业软件与互联网软件在非功能性需求上的根本差异:确定性、可观测性、长生命周期。为什么 Qt 6.x 是构建工业级软件的理想基座。 |
第 2 节 | Qt 6.x 模块全景与选型策略 | Qt 6.x 核心模块、附加模块、增值模块的边界与依赖关系。工业场景中的选型决策树:什么时候用 Qt Widgets,什么时候切 Qt Quick/QML。Qt 6.x 相比 Qt 5.x 在 CMake 构建体系上的根本性变化。 |
第 3 节 | 工业级项目工程结构设计 | 从"一个 main.cpp 写到底"到可维护的工程结构。目录分层规范、模块拆分原则、静态库与动态库的取舍。CMake 多级构建脚本的设计模式。通过源码编译管理 Qt 第三方依赖的最佳实践。 |
第 4 节 | 信号槽的深层机制与高级用法 | 信号槽不只是"点按钮弹窗口"。DirectConnection、QueuedConnection、BlockingQueuedConnection 的底层调度机制与适用边界。跨线程信号的安全交付协议。用信号槽构建事件驱动的解耦架构。 |
第 5 节 | 多线程架构(上):基础与陷阱 | QThread 的正确用法:Worker Object 模式 vs 继承 QThread。线程优先级、亲和性与 CPU 绑核。工业场景中多线程的常见灾难:死锁、优先级反转、伪共享,以及如何从架构层面规避这些问题。 |
第二阶段:核心架构模式
序号 | 课题 | 核心内容 |
第 6 节 | 多线程架构(下):任务调度与线程池设计 | QRunnable 与 QThreadPool 的调度策略。构建工业级的异步任务流水线。QConcurrent 在数据处理密集型场景中的实战。线程间背压控制与流量整形。 |
第 7 节 | 插件式架构的设计与实现(上) | 为什么工业软件必须支持插件化。Qt Plugin 系统的底层原理:QPluginLoader、元对象系统中的动态类型识别。定义稳定的插件接口协议。 |
第 8 节 | 插件式架构的设计与实现(下) | 实战:构建一个支持热加载算法的工业检测框架。插件生命周期管理、版本兼容性校验、异常隔离。从插件架构延伸到微内核架构。 |
第 9 节 | 模型-视图架构的深度应用 | Model/View/Delegate 不只是给表格用的。自定义 Model 实现工业数据的实时映射。海量数据下的视图性能优化:懒加载、虚拟化渲染、按需刷新。QAbstractItemModel 与实时数据源的绑定模式。 |
第 10 节 | 命令模式与操作可撤销架构 | QUndoCommand 框架的深层设计。将工业设备的每一次操作封装为可追溯、可回滚的命令对象。操作日志的自动记录与回放引擎。这是构建高可靠性工控系统的关键模式。 |
第 11 节 | 状态机与工作流引擎 | Qt 状态机框架的演进:从 QStateMachine 到 SCXML。构建工业流程的声明式状态机。异步状态转换与超时处理。实战:设计一个设备启动-运行-故障-恢复的完整生命周期状态机。 |
第 12 节 | 观察者模式与事件总线 | 从信号槽到全局事件总线的演进。构建跨模块、跨线程的类型安全事件系统。事件订阅、分发、过滤与审计。避免事件风暴的架构约束。 |
第三阶段:工业设备层
序号 | 课题 | 核心内容 |
第 13 节 | 串口通信的工业级封装 | QSerialPort 的异步编程范式。设计健壮的协议解析层:帧同步、校验、超时重传。解决工业现场常见的粘包、断帧、数据错位问题。 |
第 14 节 | ModBus 协议栈的完整实现 | ModBus RTU 与 ModBus TCP 的主站/从站实现。寄存器映射的抽象设计。构建跨设备的统一数据访问层。实战:与西门子、三菱 PLC 的通信对接。 |
第 15 节 | CAN 总线与车载/储能协议 | QCanBus 框架的抽象设计。J1939 协议栈、CANopen 协议栈的技术选型。解析充电桩 BMS 通信报文。多路 CAN 设备的高并发管理。 |
第 16 节 | 网络通信的工业级架构 | TCP 长连接的心跳保活、断线自动重连、消息队列缓存机制。UDP 在实时控制场景中的应用边界。HTTP 与 MQTT 在工业物联网中的角色分配。 |
第 17 节 | 数据持久化的架构设计 | QSqlDatabase 与多线程的协作模式。SQLite 在嵌入式工业设备中的写入优化。数据库迁移与版本管理。实战:构建一个支持时间范围查询的工业历史数据库。 |
第 18 节 | 日志与可观测性系统 | 工业软件的日志体系不是 printf。分级日志、滚动存储、远程上报的完整设计。用 Qt 构建运行时监控仪表盘:线程状态、内存占用、通信吞吐量的实时可视化。 |
第四阶段:可视化与交互层
序号 | 课题 | 核心内容 |
第 19 节 | 自定义控件的设计模式 | 从 QPainter 绘制到完整自定义控件的工程化流程。控件的外观-逻辑分离。实战:构建工业仪表盘、实时曲线图、设备拓扑图。 |
第 20 节 | Qt Quick 与 QML 的工业应用 | QML 适合什么场景,不适合什么场景。C++ 与 QML 的高效集成模式。用 QML 构建动态交互的产线监控界面。 |
第 21 节 | Qt Quick 3D 与数字孪生 | Qt 6.x 最亮眼的新能力。构建产线的三维数字模型。用实时数据驱动三维场景中的设备运动。360度虚拟巡检与动画交互。 |
第 22 节 | OpenGL 与高性能渲染 | 在 Qt 中嵌入 OpenGL 的正确方式。QOpenGLWidget 与 Qt Quick 3D 的选型边界。工业点云数据的实时渲染优化。 |
第 23 节 | 多屏与多窗口管理 | 一机多屏、一屏多窗的布局管理。窗口间数据同步与上下文传递。工业控制场景中主副屏的协同设计模式。 |
第 24 节 | 国际化与多语言支持 | Qt Linguist 工具链的工程化集成。运行时动态切换语言的架构设计。工业软件多语言版本的发布与维护策略。 |
第五阶段:交付、测试与运维
序号 | 课题 | 核心内容 |
第 25 节 | 自动化测试架构 | 单元测试:QTest 框架的深度使用。集成测试:模拟硬件设备的 Mock 层设计。GUI 测试:模拟用户操作的自动化脚本。 |
第 26 节 | 持续集成与部署 | 用 CMake 和 GitHub Actions / Jenkins 构建 CI/CD 流水线。Linux 与 Windows 双平台的交叉编译策略。Qt 应用的打包与分发:linuxdeployqt、windeployqt 与安装包制作。 |
第 27 节 | 在线升级与热修复 | 工业设备的 OTA 升级架构:全量升级、增量升级、灰度发布。升级包的安全校验与断点续传。Qt 应用的模块级热替换探索。 |
第 28 节 | 远程运维与云平台对接 | MQTT 协议在设备运维中的核心地位。构建设备端的数据采集与上云管道。云端指令下发与设备侧的安全执行。 |
第 29 节 | 性能分析与优化 | Qt 应用的性能剖析工具链:Qt Creator Profiler、Valgrind、perf。常见性能瓶颈的定位与解决:界面卡顿、内存泄漏、线程阻塞。 |
第 30 节 | 结业项目:智能制造产线上位机 | 综合运用全部课程知识,独立交付一个完整的工业上位机系统:PLC 通信、实时数据看板、三维数字孪生、历史数据查询、用户权限管理、在线升级。这节课既是终点,也是学员作品集的起点。 |
前言:为什么写这门课,以及你该怎么学
一、写在前面的故事
2016年深秋,我被派到东莞一家电子厂处理一个紧急问题。产线上一台视觉检测设备的上位机软件每隔大约四十分钟就会卡死一次,只能重启。重启一次,产线就要停线六分钟。这条产线每天的产值大约是十二万,停六分钟就是五千块没了。
我到现场第一件事是看代码。那份代码大概有三万行,全部堆在两个文件里。作者是一个已经离职的工程师,代码风格非常一致——没有注释,变量名是拼音缩写,所有的逻辑都连在信号槽里,信号又触发新的信号,新的信号再触发别的信号,活像一个线团。
我花了一天半的时间理出线索:作者在一个定时器回调里操作了一个已经被析构的控件,导致了野指针。这个 Bug 隐藏在一层层信号的传递链条中,不跑满大约四十分钟根本不会触发。
当时我就在想:如果写这份代码的人,在动手之前对信号槽的调度机制、对象生命周期管理和多线程边界有基本的认知,这个 Bug 从一开始就不会存在。
这不是一个人的问题。此后几年,我在各种工业现场见过无数类似的场景——有把数据库操作全部扔在主线程导致界面卡成幻灯片的,有在多线程里裸写共享变量不加任何保护导致数据随机错乱的,有把整个通信协议解析写在一个三千行的函数里的。这些问题背后有一个共同的根源:写代码的人具备了 Qt 的 API 使用能力,但没有建立起工业级软件的架构意识。
这门课,就是为填补这个缺口而准备的。
二、工业软件开发的痛点:从"能跑"到"能交付"
任何一个用 Qt 写过几个小工具的人都会有这种体验:做一个能跑的程序并不难。拖几个控件,写几个信号槽,调用几个 API,一个带界面的程序就出来了。Qt 的 API 设计以直觉友好著称,这让它的入门门槛远低于其他框架。
但"能跑"和"能交付"之间,隔着一道巨大的鸿沟。
什么是能交付的工业软件?
▎稳定性:不是"大部分时间能跑",而是 7×24 小时连续运行不崩溃、不泄漏内存、不悄悄积累逻辑错误。工厂的设备一旦上线,运行周期可能是半年甚至一年。任何一次非计划停机都是成本。
▎可维护性:工业软件的生命周期往往在五年甚至十年以上。你写的代码,三年后可能是另一个人在维护。那个人能不能看懂你的架构,能不能在不破坏现有功能的前提下加一个新需求,这是从你落笔的第一行代码就决定的。
▎可扩展性:今天对接的是西门子 PLC,明天客户可能要求兼容三菱或者倍福。今天只监控一条产线,下个季度可能要扩展到整个车间。如果每加一个设备就要大改核心代码,这个软件在商业上就是失败的。
▎可观测性:软件出了问题,能不能定位?内存占用在涨,是哪个模块在泄漏?通信延迟在增加,是协议栈的问题还是串口驱动的问题?没有可观测性,运维就是蒙着眼睛拆炸弹。
这些要求,API 文档里不会教你。你查 QSerialPort 的说明,它会告诉你 write() 函数怎么用,但它不会告诉你当一个串口设备突然拔掉时你应该怎么设计重连策略。你查 QThread 的文档,它会告诉你 start() 和 run() 的用法,但它不会告诉你一个工业软件应该用什么样的线程模型来既保证实时性又避免死锁。
这些知识,分散在一个个项目的事故报告里,分散在资深工程师的大脑里,分散在那些"吃过的亏"里。这门课程的目标,就是把这些分散的、隐性的知识,系统化地整理出来,变成一套可以学习和复用的方法论。
三、Qt 6.x 的角色:为什么是它
做工业软件开发,可选的 GUI 框架其实不少。Windows 上有 WPF 和 WinForms,跨平台的有 Electron 和 JavaFX,嵌入式领域还有轻量级的 LVGL 和 TouchGFX。为什么偏偏选 Qt,而且是 Qt 6.x?
先回答"为什么是 Qt"
Qt 在工业领域的地位,不是因为它最适合写界面——单论写界面的便利性,WPF 和 Electron 各有各的粉丝。Qt 真正的壁垒在于它的全栈能力。
一个工业上位机软件需要什么?它需要和硬件通信(串口、CAN、以太网),它需要做数据处理和存储(SQL),它需要做可视化(图表、三维模型),它需要支持多线程(实时数据采集和 UI 渲染必须分离),它需要跨平台(开发在 Windows,部署到 Linux 工控机),它还需要在不需要浏览器内核的前提下做到这一点。
能满足所有这些要求,同时把内存占用控制在几百兆以内、启动时间控制在几秒以内的框架,目前 Qt 是唯一成熟且经过大规模工业验证的选择。
能力维度 | Qt 6.x | Electron | WPF | JavaFX |
串口/CAN/网络 | ✅ 原生全栈 | ❌ 需第三方 | ⚠ 仅串口 | ⚠ 有限 |
数据库集成 | ✅ QSql 模块 | ❌ Node.js 库 | ✅ ADO.NET | ✅ JDBC |
三维渲染 | ✅ QtQuick3D/OpenGL | ⚠ Three.js | ⚠ Helix 等 | ⚠ 有限 |
多线程模型 | ✅ 原生线程池 | ⚠ Worker线程 | ✅ Task/TAP | ✅ Completable |
跨平台 | ✅ Win/Linux/macOS | ✅ 跨平台 | ❌ Windows 专属 | ✅ JVM平台 |
内存占用 | 🟢 100-300MB | 🟡 200-800MB | 🟢 100-300MB | 🟡 200-500MB |
启动速度 | 🟢 1-3秒 | 🟡 3-10秒 | 🟢 1-3秒 | 🟡 2-5秒 |
工业验证 | ⭐⭐⭐ 成熟 | ⭐ 稀缺 | ⭐⭐ 部分 | ⭐ 稀缺 |
再回答"为什么是 Qt 6.x"
Qt 6 发布于 2020 年底,到今天(2026 年)已经是一个成熟稳定的主版本。相比 Qt 5,Qt 6 带来了几个对工业软件开发至关重要的升级:
1. CMake 成为一等公民:Qt 5 时代,qmake 是官方推荐的构建工具,但它的能力在大型项目中捉襟见肘。Qt 6 彻底转向 CMake,这意味着你可以用工业标准的构建体系来管理项目,集成 CI/CD、管理第三方依赖、组织多模块工程,一切都变得顺理成章。
2. 图形架构的现代化:Qt 6 将渲染后端从 OpenGL 切换到了 RHI(Rendering Hardware Interface),底层可以跑在 OpenGL、Vulkan、Metal 甚至 Direct3D 上。对于工业数字孪生这种需要大量三维渲染的场景,这意味着更好的跨平台性能和更现代的图形特性支持。
3. Qt Quick 3D 的成熟:Qt 5 时代做三维可视化,你得自己撸 OpenGL 或者集成第三方引擎。Qt 6 把 Qt Quick 3D 从一个技术预览打磨成了可以用于生产的模块。给产线做一个三维数字孪生监控界面,现在可以在 Qt 框架内一气呵成。
4. C++17 支持:Qt 6 要求编译器至少支持 C++17。这意味着你可以在 Qt 项目里使用结构化绑定、折叠表达式、constexpr if、内联变量这些现代 C++ 特性。对于一个长期维护的工业项目来说,能用更简洁、更安全的方式表达逻辑,就是实打实的生产力提升。
⚠ 版本注意事项 Qt 6.x 在 5.15 之后移除了 Qt Script 模块(建议使用 QJSEngine 替代) QDesktopWidget 已被废弃(用 QScreen 替代) 多媒体模块做了较大重构 Qt 5 的长期支持已在 2025 年结束,现在入行直接从 Qt 6 开始是最佳选择 |
四、课程的设计逻辑:五阶段递进
这门课不是讲 Qt API 的。市面上已经有足够多的 Qt 入门教程,从 Hello World 写到信号槽,再做一个记事本,你跟着敲一遍,学到的就是 API 怎么用。
这门课的定位不同。它的目标受众是:你已经能独立写 Qt 程序了,但每次拿到一个新项目,面对空白工程时,你不太确定一个"好"的项目应该长什么样。类的组织结构怎么设计?模块之间怎么解耦?线程怎么划分?通信协议怎么封装?异常状态怎么处理?
这些问题,没有标准答案。但有一套经过验证的、可以复用的分析框架和设计模式。课程的全部 30 节课,就是带着你把这套框架建立起来。
▎第一阶段:架构思维的基石(第 1–5 节)
这个阶段要解决的核心问题是:工业软件和普通的桌面软件到底有什么本质区别?很多人写了几年代码,从来没有认真思考过这个问题。我们会从工业软件的非功能性需求(稳定性、可观测性、长生命周期)出发,反推出架构设计上的约束条件。然后建立 Qt 6.x 的完整模块地图,让你知道什么场景该用什么模块。到第 5 节结束的时候,你会掌握 Qt 多线程编程的底层机制——QThread 的使用范式、信号槽在跨线程场景下的调度行为、以及线程安全的设计边界。这些内容是后续所有实战的根基。
▎第二阶段:核心架构模式(第 6–12 节)
有了根基,接下来要建立工具箱。这一阶段的每节课对应一种在工业软件中反复出现的架构模式。插件式架构让你可以热加载新的算法和驱动而不需要重新编译主程序。模型-视图架构让你优雅地解耦数据存储和界面展示,应对海量工业数据的实时刷新。命令模式让每一次操作都可追溯、可撤销——这是高可靠性工控系统的标配。状态机让你能用声明式的方式管理设备复杂的状态流转,而不是堆砌 if-else。事件总线让你在模块之间建立松耦合的通信渠道。每一个模式我们都会讲清楚三个问题:它解决什么痛点、在 Qt 中怎么实现、以及它适用的边界在哪里。滥用设计模式比不用的危害更大,所以边界意识在这个阶段会被反复强调。
▎第三阶段:工业设备层(第 13–18 节)
有了架构模式和思维方法,要开始和真实硬件打交道了。这一阶段是一个标准的工业项目从零到一的缩影。从串口通信的底层开始,你学到的不只是 QSerialPort 怎么用——而是如何封装出一个健壮的通信层,处理数据粘包、帧同步、超时重传和掉线恢复这些工业现场的真实问题。然后进入工业自动化领域应用最广的 ModBus 协议。我们会逐层实现一个完整的 ModBus 协议栈,从 RTU 到 TCP,从主站到从站,再到上层统一的寄存器访问接口。接着延伸到 CAN 总线——这是汽车电子和新能源领域必用的技术——你会学到 J1939 和 CANopen 的基本架构,以及在充电桩场景中的典型应用。
▎第四阶段:可视化与交互层(第 19–24 节)
工业软件的"脸面"同样需要专业对待。这部分从自定义控件讲起,你会在 QPainter 的画布上绘制专业的工业仪表盘、实时曲线和设备拓扑图。然后是 Qt Quick 与 QML 的正确使用方式——什么场景适合用 QML 做界面,什么场景适合留在 Widgets 里,我们会给出明确的决策依据。第 21 节是整个课程中最具视觉亮点的一节:基于 Qt Quick 3D 构建产线的数字孪生界面。这是 Qt 6.x 带来的一项全新能力,我们用真实数据驱动三维场景中的设备运动,实现虚拟巡检。接着用一节讲 OpenGL 在 Qt 中的集成方式,让你在需要更高性能渲染时知道从何入手。
▎第五阶段:交付、测试与运维(第 25–30 节)
软件写完不等于项目完成。交付阶段的工作量往往占整个项目周期的一半以上,但传统的编程课程极少涉及这部分。我们从自动化测试开始——单元测试、集成测试、GUI 自动化测试逐层展开,让你建立起对代码质量的量化信心。然后搭建持续集成流水线,解决 Qt 应用在 Windows 和 Linux 下的自动化编译、打包、分发。在线升级是工业软件中最被低估的难点之一:如何安全地更新一个正在运行中的工业设备?OTA 升级的架构设计、增量包管理、断点续传、安全校验、失败回滚,这些我们会完整覆盖。最后一节是结业项目:综合运用课程全部知识,从零交付一个智能制造产线上位机系统。完成这个项目,你的简历上就有了一个有分量的作品。
五、课程知识点全景
为了让读者在开始学习之前对课程内容有一个俯瞰式的了解,这里把五个阶段覆盖的核心知识点做一个系统的梳理。
📌 架构与工程能力
·工业软件的分层架构设计原则
·CMake 多级构建体系的编写和维护方法
·Qt 模块的依赖管理与选型决策框架
·信号槽在多线程环境下的调度机制与安全使用边界
·基于 Worker Object 模式的多线程架构
·QThreadPool 和 QConcurrent 的任务调度策略
·线程间的背压控制与流量整形技术
📌 设计模式
·插件式架构的设计实现与生命周期管理
·Model/View/Delegate 在海量数据场景下的优化技巧
·命令模式与 QUndoCommand 框架的操作可追溯设计
·QStateMachine 与 SCXML 的声明式状态机建模
·跨模块事件总线的解耦通信机制
📌 设备通信
·QSerialPort 的异步编程与工业级协议封装方法
·ModBus RTU/TCP 协议栈的完整实现与设备抽象
·QCanBus 框架的使用与车载协议解析
·TCP 长连接、MQTT 与 HTTP 在工业物联网中的角色分配
📌 数据与运维
·QSqlDatabase 在多线程环境中的安全使用模式
·日志分级、滚动存储与远程上报系统的构建方法
·MQTT 设备云管平台的对接架构
·OTA 在线升级的安全交付机制
📌 可视化
·QPainter 自定义控件的工程化设计方法
·QML 与 C++ 的高效混合编程模式
·Qt Quick 3D 的数字孪生应用开发
·OpenGL 与 Qt 的集成渲染技术
·多屏多窗口的布局管理
·Qt Linguist 国际化工具链的工程集成
📌 测试与交付
·QTest 单元测试框架的使用与 Mock 设计
·CI/CD 流水线在 Qt 项目中的应用
·多平台交叉编译与安装包制作
·Qt 应用程序的性能分析与优化方法
以上这些知识点,不是孤立的 API 教学,而是围绕"做一个真正能部署到工厂的工业上位机系统"这个总目标,有机组织起来的完整技能树。每一节的知识点都是下一节的必要前提,后一节的内容则是对前面知识的综合运用和深化。
六、课程使用的软件版本与环境
下面明确课程所使用的核心软件版本和运行环境。本书写作和所有示例代码验证基于以下版本。
类别 | 推荐配置 | 备注 |
操作系统(开发) | Ubuntu 24.04 LTS / Windows 11 | 工业部署以 Linux 为主 |
操作系统(部署) | Ubuntu 24.04 LTS / Debian 12 | 工控机追求长期稳定性 |
Qt 版本 | Qt 6.5 LTS | 至少三年补丁支持,API 适用于 6.2–6.8+ |
编译器(Linux) | GCC 13.x | 需支持 C++17(Qt 6 硬性要求) |
编译器(Windows) | MSVC 2022 / MinGW 11 | MSVC 对 QWebEngine 支持更完整 |
构建工具 | CMake 3.21+ | 唯一使用的构建系统 |
IDE | Qt Creator 12.x | 非强制,VS Code / CLion 亦可 |
文档工具 | Doxygen | 代码文档生成 |
版本管理 | Git | — |
💡 硬件说明 工业设备层示例大部分提供虚拟设备模拟方案,无需实际硬件 ModBus 部分使用开源模拟器作为通信对端 CAN 总线部分可使用 SocketCAN 虚拟接口进行本地测试 第 13–15 节在没有任何外部硬件的情况下也能完整运行和理解 |
七、适合阅读的人群
这门课的目标读者画像比较明确。如果你符合以下任意一种,这门课就是为你准备的。如果你全部不符合,你可能需要先补充一些前置知识再回来。
第一类:有 Qt 使用经验但缺乏架构意识的开发者
这是最核心的目标用户。你至少完整做过一个 Qt 项目,能熟练使用信号槽、常用控件和基本布局,但你越来越感觉到,你写的代码在项目规模变大之后变得难以维护。你可能是自学成才,没有经历过大型项目的锻炼,你的代码能跑但你不确定它是不是"好代码"。这门课会给你一套完整的评价框架和改进路径。
第二类:工业自动化领域的上位机开发人员
你对 PLC、传感器、工业协议这些有实际经验,但你的项目使用的是组态软件或者其他框架。现在你想把技术栈切换到 Qt,但你不只是想学 API——你想知道:工业的串口通信在 Qt 里怎么封装才稳定,批量数据采集怎么设计线程模型才不丢帧,界面卡顿怎么排查和优化。你带着真实的业务痛点来,这门课就是围绕这些痛点组织的。
第三类:嵌入式 Linux 开发人员向应用层拓展
你可能是做驱动的,可能是做 BSP 的,也可能是做系统裁剪的。你对 Linux 底层很熟,但你发现自己做的设备需要一个用户界面,而你对怎么写一个架构良好的 GUI 程序没有系统认知。这门课会帮你把底层的能力延伸到应用层,让你成为一个完整的嵌入式系统工程师。Qt 在嵌入式 Linux 上的运行环境(EGLFS、Wayland、XCB)与桌面环境有一些差异,课程中会有专门的提示。
第四类:计算机相关专业的高年级学生或研究生
你在学校的课程项目里用 Qt 做过一些东西,但你知道那跟工业界的要求有差距。你希望毕业之前能拿出一个有分量的项目经历。这门课的结业项目——"智能制造产线上位机系统",可以用作毕业设计或在求职时的作品展示。它覆盖了通信、数据库、三维可视化、多线程等用人部门最看重的技术点。
前置知识要求:
▸C++ 基础:熟练掌握 C++ 语法,理解类、继承、多态、模板等核心概念,熟悉 STL 常用容器。C++11/14/17 新特性有一定了解更佳。
▸基本 Linux 操作:能在终端中执行基本命令,理解文件权限、环境变量、软件包管理等概念。
▸基本计算机科学概念:线程和进程的区别、TCP 和 UDP 的区别、堆和栈的区别——这些操作系统和网络的基础知识是理解课程后半部分的前提。
补充说明:这门课叫做"构建工业级软件架构",这个表述是克制的。我不会承诺学完 30 节课你就能成为架构师——架构师不是一门课能教出来的,它需要真实项目中大量的决策实践和经验积累才能逐渐形成判断力。但这门课可以做到的是:给你一套经过验证的、可以在项目中直接套用的架构框架,帮你在日常开发中做出更好的设计决策,把你从"只能通过堆砌代码来实现功能"的阶段,提升到"能有意识地用设计模式来组织代码"的阶段。这个跃迁本身,就已经足以让你的工作质量和职业竞争力上升一个档次。
八、怎么使用这门课:学习方法建议
学一门技术课,方法不对,效果打折。这些年我见过太多人把教程从头到尾看一遍、代码一行不写,然后自我感觉良好。等到真要动手做项目了,发现根本不知道从何下手。
针对这门课的特点,我给出一个经过实践检验的学习路径。
第一步:每一节课的代码都要亲手敲一遍
这句话说一百遍都不为过。看一遍代码和写一遍代码,你大脑中激活的脑区是不同的。看书时你觉得理解了,可能是因为作者的表达让你产生了"熟悉感",而不是你真的掌握了。只有当你面对空白编辑器,一行一行地把逻辑重新构建出来,你才会碰到那些真正的问题——编译错误、运行时异常、不符合预期的行为。而这些踩坑的过程,才是学习的核心环节。课程的每一节正文中包含大量的代码示例——这些代码不是"示意性的",而是可以直接复制到你的项目里编译运行的真实代码。但我的建议是:不要复制粘贴。看着代码,理解逻辑,然后在你的工程里重新敲一遍。
第二步:学完一节之后立刻动手改动
把示例代码中的参数改一改,看看会发生什么。把某个通信协议的目标地址换成不存在的设备,看看你的程序有没有正确处理超时。把一个 QThread 的优先级调高,观察它对界面的影响。故意在信号槽的连接中写一个拼写错误,看看 Qt 的错误提示是什么样的,训练自己阅读和定位此类问题的能力。这些"破坏性实验"会让你对边界条件有直观的认知。
第三步:结业项目不要留到最后
很多人会有"我先跟着学到第 30 节再说,最后再做项目"的心态。我不能说这条路走不通,但效果确实不太好。30 节的内容量不小,学到后面,前面的一些细节难免会变得模糊。我建议从第 13 节开始就启动你的结业项目骨架:搭建目录结构,配置 CMake,创建空白主窗口。然后随着课程推进,逐步往里面添加内容——学完串口通信就加上模拟设备的通信模块;学完 ModBus 就加上 PLC 协议对接;学完数字孪生就加上三维预览区。这样到第 30 节的时候,你的项目早就完成了。
第四步:利用好课程配套资源
本书所有示例代码的完整工程都可以在配套代码仓库中获取。如果你在按步骤操作时卡住了,可以对照参考代码排查差异。但请记住:先尝试自己解决问题,再查阅参考代码。如果你习惯了一遇到问题就打开参考答案,你就等于放弃了锻炼调试能力的最好机会。真实工作中没有参考答案,调试能力是工业软件开发者的核心竞争力之一。
第五步:遇到问题主动搜索和提问
课程覆盖的内容虽然系统,但总有边界之外的情况。你在自己的机器上运行时可能会遇到和课程描述不一致的行为——不同的 Qt 版本、不同的操作系统、不同的编译器都可能带来细微的差异。遇到这种情况,先去搜索引擎用英文关键词查(Qt 的英文社区远比中文社区活跃),Qt 官方论坛和 Stack Overflow 上有海量的同类问题。如果仍然解决不了,把环境信息、完整错误信息和已尝试的排查步骤整理好,在课程对应的技术社区提问。提问的质量决定了你获得帮助的速度。
第六步:建立你自己的知识索引系统
30 节的内容量,全部记在脑子里是不现实的,也没必要。你需要培养一种能力:知道某个知识点在课程中哪个位置讲过,能在需要的时候快速定位到。我的建议是:在学习过程中,维护一份你自己的"知识点到章节号"的索引表。比如:"串口掉线重连策略——第 13 节;ModBus 寄存器映射设计——第 14 节;QThreadPool 任务调度——第 6 节;数字孪生的数据驱动方式——第 21 节"。这份索引在后续做项目时会成为你最常用的工具。
九、致谢与期待
写一门课,就像盖一栋房子。每一块砖都是前人的积累,我只是做了整理和连接的工作。
首先要感谢 Qt 公司及其开源社区。过去近三十年,Qt 从一个挪威小团队的 GUI 工具包,成长为覆盖桌面、嵌入式和移动端的全栈应用框架,这是一件了不起的事情。没有这个强大的基座,我们很多做工业软件开发的人可能还分散在各个不兼容的技术栈里,各自重复造轮子。
感谢我的同事们。这门课里很多案例的灵感,来自于我们共同在工业现场处理过的真实项目。那些在产线旁边熬夜排查 Bug 的经历,那些被客户催着上线时的紧张感,那些在项目复盘会上总结出的教训——这些都化作了课程中的具体内容。技术书籍最怕空对空,正是因为有了这些真实的项目经验,这门课才有底气说"这是工业级的"。
感谢早期试读的朋友们。在课程初稿完成后,有几位做上位机开发的朋友帮忙做过技术审校。他们提了很多尖锐的意见,比如"这个地方的线程模型在极端情况下还是会有边界问题,得补充说明"、"那个示例代码在实际产线上会因为设备响应慢导致 UI 假死,你没有提到怎么处理"。这些问题,在正式版本中都已经做了修正和补充。各位的严苛,让课程内容更经得起推敲。
最后,感谢你,选择了这门课的读者。
这很可能是你技术生涯中一次重要的投资——不是金钱上的,而是时间和精力上的。三十节课,从第一行 CMake 到最后的结业项目,完整地走下来,至少需要 200 个小时的高强度投入。你愿意花这些时间,说明你是真的想在工业软件开发这条路上往前走一步。我唯一能承诺的是:课程中每一个知识点、每一段示例代码、每一条设计建议,都经过了反复推敲和验证,都是我本人在同等场景下会选择的技术方案。我不会给你一个我自己都不用的"教学特供版"写法来假装简单,那样你到了真实项目中会摔得很惨。
工业软件开发是一道漫长的阶梯。每一级台阶都是用一行又一行的代码、一次一次的调试、一夜一夜的复盘铺成的。这门课能做的,是帮你扫清最初的那十几级台阶上最容易卡住人的障碍,让你花更少的时间在踩坑上,花更多的时间在真正创造价值的事情上。
现在,翻到第一章,我们从架构思维的建立开始。
2026年6月,于深圳
附录:课程知识体系索引表
以下索引表可帮助你在学习和工作中快速定位所需知识点对应的章节。
知识领域 | 具体知识点 | 所在章节 |
架构设计 | 工业软件分层架构 | 第 1 节 |
架构设计 | CMake 多级构建 | 第 3 节 |
架构设计 | 信号槽调度机制 | 第 4 节 |
多线程 | Worker Object 模式 | 第 5 节 |
多线程 | QThreadPool 任务调度 | 第 6 节 |
多线程 | 背压控制与流量整形 | 第 6 节 |
设计模式 | 插件式架构 | 第 7–8 节 |
设计模式 | Model/View/Delegate | 第 9 节 |
设计模式 | 命令模式/可撤销架构 | 第 10 节 |
设计模式 | 状态机与工作流 | 第 11 节 |
设计模式 | 事件总线 | 第 12 节 |
设备通信 | 串口通信封装 | 第 13 节 |
设备通信 | ModBus 协议栈 | 第 14 节 |
设备通信 | CAN 总线/J1939 | 第 15 节 |
设备通信 | TCP 长连接管理 | 第 16 节 |
设备通信 | MQTT 协议 | 第 16/28 节 |
数据管理 | QSqlDatabase 多线程 | 第 17 节 |
数据管理 | 工业历史数据库 | 第 17 节 |
可观测性 | 日志系统设计 | 第 18 节 |
可观测性 | 运行时监控仪表盘 | 第 18 节 |
可视化 | QPainter 自定义控件 | 第 19 节 |
可视化 | QML/C++ 混合编程 | 第 20 节 |
可视化 | Qt Quick 3D 数字孪生 | 第 21 节 |
可视化 | OpenGL 集成渲染 | 第 22 节 |
可视化 | 多屏多窗口管理 | 第 23 节 |
可视化 | Qt Linguist 国际化 | 第 24 节 |
测试 | QTest 单元测试 | 第 25 节 |
测试 | Mock 硬件层设计 | 第 25 节 |
交付 | CI/CD 流水线 | 第 26 节 |
交付 | 多平台交叉编译 | 第 26 节 |
运维 | OTA 在线升级 | 第 27 节 |
运维 | 远程云平台对接 | 第 28 节 |
性能 | Profiler/Valgrind/perf | 第 29 节 |
综合 | 结业项目:产线上位机 | 第 30 节 |
夜雨聆风