C++/Qt 上位机学习项目,五层架构 + 多线程并发

C++/Qt 上位机学习项目,五层架构 + 多线程并发

📊 工业设备监控管理系统(IndustrialMonitor v3.0)

技术栈:C++17 + Qt 6(兼容 Qt 5.15)+ SQLite + Qt Charts 总代码量:约 6,200+ 行(37 个源文件 + 3 个单元测试) 构建系统:CMake 3.16+(含 CTest 单元测试)


界面展示:

添加图片注释,不超过 140 字(可选)

添加图片注释,不超过 140 字(可选)

一、14 天学习计划总览

1.1 逐日主题与产出

天数

阶段

主题

新增文件

代码量

核心知识点

Day 1

🏗️ 地基

项目搭建 + 核心数据结构

4

~350

enum class 强类型枚举、QStringLiteral、C++11 统一初始化、头文件保护宏、inline 函数

Day 2

🏗️ 地基

数据库层(SQLite)

2

~450

QSqlDatabase/QSqlQuery、参数化查询防注入、事务 100x 性能提升、WAL 模式、PRAGMA 优化

Day 3

⚙️ 业务核心

设备管理器(仿真引擎)

7

~500

QReadWriteLock 读写锁、信号槽、std::move 移动语义、std::find_if+Lambda、mutable 关键字

Day 4

⚙️ 业务核心

仿真工作线程(QThread)

2

~280

moveToThread Worker 模式、QueuedConnection、线程生命周期(quit→wait)、QThread::started 信号

Day 5

⚙️ 业务核心

用户认证系统

2

~360

QCryptographicHash::Sha256、每用户独立盐值、模糊错误信息防枚举、三层架构、static 方法

Day 6

🎨 UI 层

登录界面

2

~330

QFormLayout、QLineEdit::EchoMode、QSS 三态按钮、show() vs exec()、非阻塞信号驱动

Day 7

🏛️ 架构

应用控制器(状态机)

3

~330

状态机模式(Init→Login→Main→Logout→Exit)、QTimer::singleShot(0)、deleteLater()、依赖注入

Day 8

🎨 UI 层

主窗口骨架 + 仪表盘

0

~500

QGridLayout 网格布局、QTabWidget 标签页、QStyle::standardIcon()、白名单权限、QFrame 卡片

Day 9

🎨 UI 层

设备列表 + 数据总览

2

~400

QTreeWidget(平铺列表)、QTableWidget 颜色编码、Qt::UserRole 隐藏数据、全量刷新策略

Day 10

🎨 UI 层

报警管理面板

2

~450

QStandardItemModel+QTableView、QueuedConnection 防死锁、QItemSelectionModel、行背景色

Day 11

🎨 UI 层

趋势分析(Qt Charts)

2

~500

QChart+QLineSeries+QDateTimeAxis 五件套、attachAxis 绑定、QButtonGroup 单选、QOverload<int>::of

Day 12

🎨 UI 层

设备详情 + 报表导出

3

~560

QFile+QTextStream 文件 I/O、CSV 转义 RFC 4180、toHtmlEscaped()、open() vs exec()、WA_DeleteOnClose

Day 13

🎨 UI 层

用户管理对话框

2

~360

QInputDialog 快速输入、itemSelectionChanged 联动、安全约束四层防护、QDateTime::isValid()

Day 14

✅ 收官

整合测试 + 全景回顾

+3 (测试)

~500

CMake 完整配置、CTest 单元测试、Qt Test 框架、CI/CD 工作流、3 层架构梳理

合计

37

~6,200+

65+ 个 C++/Qt 知识点

1.2 每日学习密度分析

维度

Day 1-2

Day 3-5

Day 6-7

Day 8-13

阶段名称

数据层

业务逻辑层

架构控制层

UI 视图层

代码量

~800

~1,140

~660

~2,770

新增文件数

6

11

5

12

C++ 知识点

enum class、inline、初始化列表、移动语义

读写锁、Lambda、移动语义、static

QTimer::singleShot、deleteLater

QOverload、qobject_cast

Qt 知识点

QStringLiteral、QSqlQuery、PRAGMA

信号槽、moveToThread、QCryptographicHash

QMainWindow、状态机

Charts、Model/View、QInputDialog

平均难度

⭐⭐

⭐⭐⭐⭐

⭐⭐⭐⭐⭐

⭐⭐⭐

面试价值

基础

核心高频

架构加分

实用技能


二、项目整体架构分析

2.1 三层架构总览

层次

职责

包含类

关键技术

🖥️ UI 层(表现层)

用户交互、数据可视化、样式美化

LoginDialog、MainWindow、AlarmPanel、MonitorPanel、RealtimeTablePanel、EquipmentDetailDialog、UserManagementDialog

QTabWidget、QTreeWidget、QTableWidget、QChartView、QSS 样式表、QFormLayout

⚙️ 业务逻辑层(控制层)

状态机编排、权限控制、业务规则、仿真逻辑

AppController、EquipmentManager、UserManager、SimulationWorker、ReportExport

状态机模式、QReadWriteLock、QThread+moveToThread、QCryptographicHash、QFile I/O

🗄️ 数据访问层(持久化)

SQLite 读写、JSON 解析、数据封装

DatabaseManager

QSqlDatabase、QSqlQuery、QJsonDocument、参数化查询、事务、WAL 模式

2.2 数据流:从仿真到 UI 显示

仿真 tick (1.5s) │ ▼ EquipmentManager::simulateTick() ├── QWriteLocker(&m_lock) ← 写锁保护 ├── updateMetrics() │ └── 随机游走算法更新每个指标的值 ├── checkAlarms() │ └── 检测是否超限 → 生成 AlarmRecord ├── emit equipmentUpdated(id) ← 通知 UI ├── emit alarmTriggered(alarm) ← 通知报警面板(Queued!) ├── emit statisticsChanged(s) ← 通知仪表盘 │ ├──▶ MainWindow::onStatisticsChanged() │ ├── updateDashboardStats() → 8 个卡片更新数值 │ └── statusBar()->showMessage() → 状态栏更新 │ ├──▶ RealtimeTablePanel::refreshData() │ └── 全量重建 18 行数据(颜色编码) │ ├──▶ MainWindow::populateEquipmentTree() │ └── 清空树 → 重新填充 6 台设备 │ └──▶ MonitorPanel::refreshCurrentEquipment() └── updateChartData() → QLineSeries::clear+append

2.3 关键设计模式总结

设计模式

使用位置

说明

🏛️ 状态机(State Machine)

AppController

5 个状态:Init→Login→Main→Logout→Exit,信号驱动转换

🎭 外观模式(Facade)

DatabaseManager

统一封装所有 SQLite 操作,对外提供简洁 CRUD 接口

👷 Worker 模式

SimulationWorker+QThread

moveToThread 将 QObject 移入独立线程

📡 观察者模式(Observer)

所有信号/槽连接

数据变化自动通知 UI 刷新,解耦发送者和接收者

💉 依赖注入(DI)

MainWindow、UserManager

管理器通过构造函数参数传入,不自己创建

🏭 工厂方法(Factory Method)

createStatCard()

封装统计卡片创建逻辑,返回配置好的 QFrame

🌉 桥接模式(Bridge)

Model/View(报警面板)

QStandardItemModel 存数据,QTableView 显示

🔒 白名单(Whitelist)

applyPermissions()

默认隐藏所有按钮,按角色逐一开放


三、项目能学到什么?

3.1 技术能力地图

技能分类

具体掌握内容

熟练度

C++ 核心

enum class、移动语义(std::move + 右值引用)、Lambda 表达式、std::find_if、std::clamp、std::as_const、mutable、override、成员初始化列表、static 文件作用域、前置声明

⭐⭐⭐⭐⭐

C++ 新特性(C++11/17)

统一初始化 {}、默认成员初始化器、结构化绑定、constexpr、auto 类型推导、范围 for 循环

⭐⭐⭐⭐

Qt Core

QObject 对象树、信号槽(新语法 + Lambda)、QTimer、QReadWriteLock、QThread+moveToThread、QMetaObject::invokeMethod、QTimer::singleShot、deleteLater、Q_PROPERTY、Q_ENUM、Q_LOGGING_CATEGORY、QRandomGenerator

⭐⭐⭐⭐⭐

Qt 字符串/容器

QStringLiteral、QString::arg()、QByteArray、toHex/toUtf8/toLatin1、QVector、QMap、QDateTime、QColor

⭐⭐⭐⭐

Qt Widgets

QMainWindow(工具栏/状态栏)、QTabWidget、QTreeWidget、QTableWidget、QLineEdit(EchoMode)、QPushButton(setDefault/setCheckable/setMenu)、QComboBox、QCheckBox、QButtonGroup、QFrame、QGroupBox、QProgressDialog

⭐⭐⭐⭐⭐

Qt 布局

QVBoxLayout、QHBoxLayout、QFormLayout、QGridLayout、addStretch()、setContentsMargins/setSpacing、布局嵌套

⭐⭐⭐⭐⭐

Qt 对话框

QDialog(open/exec/show)、WA_DeleteOnClose、QMessageBox、QInputDialog、QFileDialog

⭐⭐⭐⭐

Qt Model/View

QStandardItemModel+QTableView、QItemSelectionModel、Qt::ItemDataRole 系统、setItem/insertRow/removeRows

⭐⭐⭐⭐

Qt Charts

QChart、QLineSeries、QDateTimeAxis、QValueAxis、QChartView、attachAxis 绑定、抗锯齿、动画

⭐⭐⭐⭐

Qt 文件 I/O

QFile+QTextStream、QIODevice::Text、setEncoding(Utf8)、CSV 转义 RFC 4180、toHtmlEscaped()

⭐⭐⭐⭐

Qt 数据库

QSqlDatabase/QSqlQuery、参数化查询、事务(BEGIN/COMMIT)、SQLite PRAGMA(WAL/同步/外键)、CRUD 操作

⭐⭐⭐⭐⭐

Qt 安全

SHA-256 单向哈希、每用户独立盐值、模糊错误信息防枚举、白名单权限、QueuedConnection 防死锁

⭐⭐⭐⭐

Qt 样式

QSS 三态按钮(hover/pressed)、动态 QString::arg() 拼色、QFrame 圆角卡片、斑马纹

⭐⭐⭐

构建/测试

CMake(多模块/双 Qt 版本兼容)、CTest 单元测试(3 个测试套件 ~710 行)、Qt Test 框架(QVERIFY/QCOMPARE)、GitHub CI/CD、内存数据库隔离测试

⭐⭐⭐⭐

3.2 软技能与工程素养

能力

项目中如何体现

面试价值

架构设计

三层架构分离、状态机模式编排、依赖注入解耦

⭐⭐⭐⭐⭐

线程安全

QReadWriteLock 读写锁、Qt 线程模型(moveToThread)、QueuedConnection 防死锁

⭐⭐⭐⭐⭐

安全设计

密码哈希+盐值、模糊错误信息、白名单权限、纵深防御四层保护

⭐⭐⭐⭐

性能意识

全量刷新 vs 增量更新权衡、事务 100x 提升、QStringLiteral 零拷贝、索引优化

⭐⭐⭐⭐

用户体验

非阻塞信号驱动、QProgressDialog 反馈、密码可视切换、自动滚动最新报警、默认焦点

⭐⭐⭐

代码质量

源文件拆分(1+4)、空指针保护、前置声明降编译依赖、static 文件作用域

⭐⭐⭐⭐

增量开发

每天可编译可运行、占位符渐进式填充、Stub 类提前引用

⭐⭐⭐⭐

调试能力

Q_LOGGING_CATEGORY 分级日志、qDebug/qInfo/qWarning/qCritical

⭐⭐⭐

四、关键技术决策分析

4.1 架构决策

决策

选项

选择

理由

UI 构建方式

Qt Designer (.ui) vs 纯代码

纯代码

版本控制友好、动态 UI 灵活、不依赖 IDE

对话框模式

exec() 阻塞 vs open() 非阻塞

混合

登录/用户管理用 exec()(数据一致性),详情用 open()(可并行查看)

状态管理

信号分散 vs 状态机集中

AppController 状态机

5 个状态、状态转换集中管理、避免”意大利面条式”信号连接

线程方案

继承 QThread vs Worker+moveToThread

Worker+moveToThread

Qt 官方推荐、信号槽可在工作线程正常使用

权限控制

黑名单 vs 白名单

白名单

默认隐藏所有按钮,按角色逐一开放——更安全

数据刷新

全量重建 vs 增量更新

全量重建

18 行数据量小、代码简单可靠、不担心遗漏变化

.2 安全决策

决策

选择

风险等级

理由

密码存储

SHA-256 + 每用户独立随机 32 字节盐值

✅ 安全

单向哈希不可逆、盐值防彩虹表、相同密码不同哈希

登录错误信息

“用户名或密码错误”(模糊)

✅ 安全

防用户枚举攻击

日志级别

QLoggingCategory 分级

✅ 安全

生产环境默认只显示 Warning+,调试日志不泄露

数据库安全

参数化查询

✅ 安全

防 SQL 注入

用户删除约束

不能删除自己

✅ 安全

防止管理员误删自己导致系统无人可管理

危险操作确认

QMessageBox::question 默认 No

✅ 安全

防止误操作

4.3 性能决策

决策

选择

影响

理由

事务

批量操作使用

100x 提升

减少 fsync 次数

数据库模式

WAL + synchronous=NORMAL

读写并发

仿真写入不阻塞 UI 读取

索引

3 个复合索引

查询加速

按(设备,指标,时间)等高频查询字段建索引

历史数据

环形缓冲 600 条

内存控制

15 分钟数据,趋势图够用

数据清理

cleanOldSamples + cleanExcessAlarms

磁盘控制

防止数据库无限增长

全量刷新

18 行全重建

<1ms

代码简单度远大于性能差异

QStringLiteral

所有字符串常量

零运行时开销

编译期 UTF-16 编码

constBegin()

只读遍历

防 detach

避免 Qt 隐式共享触发深拷贝

4.4 测试策略

决策

选择

理由

测试框架

Qt Test(<QtTest/QtTest>)

Qt 官方、零额外依赖、支持信号/槽测试、QVERIFY/QCOMPARE 等宏

测试目标

业务逻辑层(EquipmentManager / UserManager / ReportExport)

UI 层测试成本高、需模拟用户交互;业务层逻辑复杂、bug 密度高

数据库隔离

内存数据库(:memory:)

每个测试用例独立数据库,互不干扰;不写磁盘,速度快

测试组织

每个管理器一个测试文件

职责清晰、可并行编译、测试失败快速定位

CMake 集成

option(BUILD_TESTS OFF) + enable_testing()

默认不构建测试(减少编译时间),需要时用 -DBUILD_TESTS=ON 开启

CI 集成

ctest --output-on-failure

每次 push 自动运行,失败输出详细信息

五、后续学习路线

5.1 项目扩展方向

方向

建议内容

涉及技术

🔌 真实设备接入

通过串口/Modbus TCP 连接 PLC

QSerialPort、QTcpSocket、Modbus 协议

📦 MQTT 物联网

设备数据上报云端

QMqttClient、JSON 序列化、SSL/TLS

📱 移动端查看

用 QML 重写 UI

QML、Qt Quick、QAbstractListModel

🗄️ 数据库升级

从 SQLite 迁移到 MySQL/PostgreSQL

QMYSQL/QPSQL 驱动、连接池

📊 高级数据分析

引入统计学习检测异常

Python 集成、QProcess、pandas

🌐 Web 控制台

用 WebSocket 实时推送数据

QWebSocket、QHttpServer、Vue.js

🔐 多级认证

LDAP/AD 域认证、指纹/人脸

LDAP 协议、OpenCV

📈 更多图表

柱状图、饼图、仪表盘控件

QBarSeries、QPieSeries、自定义控件


📌 写在最后:这个 14 天项目从零搭建了一个完整的工业监控系统,覆盖了 C++ 核心特性、Qt 六大模块(Core/Gui/Widgets/Sql/Charts/Network)、SQLite 数据库、多线程编程、设计模式、单元测试和软件架构。65+ 个知识点、37 个源文件、6,200+ 行代码(含 3 个测试文件 710 行)——这不是一个”玩具项目”,而是一个真正的工业级应用骨架。祝你面试顺利,前途无量 🚀

题外话

一些练手项目推荐:

C++/Qt 上位机学习项目,五层架构 + 多线程并发

十个QT/C++硬核项目推荐

希望这篇回答对你有帮助! 欢迎点赞、收藏、关注~