【Qt开源项目】— ModbusScope-day 3
·
第2天:剖析程序骨架与核心数据流 (约5-6小时)
攻略步骤
-
从入口点出发:
main函数- 行动:打开
main.cpp文件。对照笔记中“main函数”部分。 - 思考:程序启动后第一件事是什么?(创建
MainApp对象,启动事件循环)。WIN32宏相关的锁是做什么的?(防止多开)。 - 行动:在IDE中,通过“转到定义”功能,跳转到
MainApp类的构造函数。
- 行动:打开
-
精读程序中枢:
MainApp类- 行动:打开
mainapp.h和mainapp.cpp。对照笔记中“MainApp类”的“数据成员”表格。 - 核心任务:
- 找到那6个模型(
SettingsModel*,GraphDataModel*等)的声明和初始化位置。理解是MainApp创建并拥有这些核心数据模型。 - 找到
MainWindow*成员的初始化。理解是MainApp创建了主窗口。
- 找到那6个模型(
- 行动:在
MainApp构造函数中,留意“初始化程序的日志系统”这一步,根据笔记跳转到ScopeLogging类稍作浏览,理解日志是如何被重定向到软件的“诊断”窗口的。 - 产出:画一个简单的框图。中心是
MainApp,它指向6个Model和一个MainWindow。这就是程序的核心数据/状态持有者关系图。
- 行动:打开
-
深入UI与逻辑集大成者:
MainWindow类- 行动:打开
mainwindow.h。准备好,这个头文件会很长。对照笔记中“MainWindow类”的“数据成员”表格。 - 核心任务:
- 识别“拥有”关系:
MainWindow持有哪些重要对象的指针?- 6个模型的指针(从
MainApp那里获取的)。 - 管理器:
ModbusPoll*(轮询调度器)、GraphView*(绘图视图)、GraphDataHandler*(数据处理)。 - 对话框:
ConnectionDialog*,LogDialog*等。 - UI组件:
NotesDock*,Legend*,StatusBar*等。
- 6个模型的指针(从
- 理解初始化顺序:浏览
MainWindow构造函数(笔记中列出了关键步骤1-21)。注意第7步:“连接ModbusPoll成员的registerDataReady信号到GraphDataHandler成员的handleRegisterData槽”。用笔标出这一行,这是数据流的关键连接点。
- 识别“拥有”关系:
- 产出:更新你的框图。在
MainWindow周围,画出它持有的ModbusPoll、GraphView、GraphDataHandler,并用箭头标明MainWindow从MainApp获取了6个模型的引用。
- 行动:打开
-
追踪核心数据流(宏观层面)
- 行动:不深入代码,仅根据笔记和你的框图,口头描述或写下“从点击开始按钮到图形显示一个数据点”的简化版故事:
- 用户在
MainWindow的UI上点击“开始”。 MainWindow调用其持有的ModbusPoll对象的startCommunication方法。ModbusPoll开始工作,通过ModbusMaster与设备通信。- 数据返回后,
ModbusPoll发出registerDataReady信号。 - 这个信号被
GraphDataHandler的handleRegisterData槽函数接收。 GraphDataHandler处理数据后,发出graphDataReady信号。- 这个信号被
GraphView的plotResults槽函数接收。 GraphView更新屏幕上的曲线。
- 用户在
- 关键:理解这是一个信号与槽驱动的异步流程。每个模块各司其职。
- 行动:不深入代码,仅根据笔记和你的框图,口头描述或写下“从点击开始按钮到图形显示一个数据点”的简化版故事:
今日学习成果
- ✅ 理解
MainApp是程序的启动者和核心模型的创建者。 - ✅ 理解
MainWindow是UI容器和主要业务逻辑的协调者,持有大量功能模块的指针。 - ✅ 能绘制出展示
MainApp、MainWindow、6大模型及ModbusPoll、GraphView等核心模块间静态持有关系的框图。 - ✅ 能描述数据从采集到显示所经过的主要模块名称和顺序(即上述“故事”)。
- 自我检验:不看书和笔记,能否在白纸上画出核心关系图?能否向别人解释清楚
MainApp和MainWindow的分工?
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)