6d1895d696
- pitfall_stack_widget / pitfall_lambda_capture / pitfall_double_connect: 默认跑正确写法(离屏验证退出码 0),--crash / --dangle 开关课堂现场触发 真实崩溃/悬空访问 - table_widget:QTableWidget 单元格事件最小示例(新安排 Day4「表格事件」) - student_manager:Day5 综合案例参考实现,离屏自测覆盖 JSON round-trip 与 QThread 后台导入闭环 - 均接入 examples/CMakeLists.txt 的 add_teaching_example,手工维护区不影响生成器
学员信息管理器 —— Day5 综合案例参考实现
对应教案
OUTLINE_4DAY.md§3「Day5 综合项目案例讲解」。 教师侧参考答案:把 Day1–4 作业线(计算器→主窗口化→JSON 落盘)收束成一个完整 小软件。手工维护,非生成产物。
覆盖的知识点(讲解时逐条回指)
| 环节 | 知识点 | 首次出现 |
|---|---|---|
| 主窗口骨架 | QMainWindow 菜单/工具栏/状态栏/setCentralWidget |
Day3 上午 |
| 列表展示 | QTableWidget + item 所有权 | Day4 上午 |
| 添加记录 | 模态 QDialog exec() + QFormLayout |
Day3 上午/下午 |
| 通信 | 信号槽(成员函数槽 + 带 context 的 lambda 槽) | Day2 |
| 数据层 | Student ↔ QJson 互逆序列化,round-trip 校验 | Day4 下午 |
| 路径 | applicationDirPath() 拼数据文件路径(不用相对路径) |
Day4 ★坑卡 |
| 健壮性 | open() 返回值、QJsonParseError 都检查 |
Day4 坑卡 |
| 提升 | QThread worker-object 模式后台导入,界面不冻结 | Day5 新授 |
QThread 三件套在 startImport() 里全部有注释标注:worker 不给 parent、
moveToThread 在 start() 之前、跨线程信号→主线程槽自动 Queued(addRow
安全地在 GUI 线程执行)。
验证方式(自测模式)
QT_QPA_PLATFORM=offscreen tools/run_qt.sh qt_student_manager
# 自测流程:添加 2 条 → 保存 JSON → 清空 → 读回校验 →
# 后台线程导入 3 条 → 总数校验 5 条;全过退出码 0,任一步失败退出码 1
tools/run_qt.sh qt_student_manager # 有 X 环境:完整交互(菜单/工具栏/对话框/后台导入)
有显示环境时数据保存在可执行文件旁的 students.json(状态栏显示完整路径)。
课堂讲解建议(对应 OUTLINE_4DAY.md §3 时段表)
- 上午先讲界面骨架与数据层(自顶向下:先跑成品,再拆 MainWindow → 数据层);
- 下午「后台导入」是提升重点:先把
msleep挪进主线程按钮槽里演示界面冻结, 再回到 worker 版本对比——「卡与不卡」亲眼见一次胜过讲十分钟; - 每讲完一段,回指上表对应的 Day1–4 知识点,让学员意识到「项目 = 已学内容的组装」。
练习方向(供 Day6–10 项目热身)
- 加「删除选中行」(
currentRow+removeRow); - 保存前若有未保存修改,关窗时弹确认框(
closeEvent+QMessageBox::question); - 把成绩列改为按数值排序(提示:
QTableWidgetItem::setData(Qt::EditRole, double))。
参考
- 前身作业:
../json_io/(Day4 数据落盘)、../table_widget/(Day4 表格)、../qthread_worker/(worker 模式最小版)