Files
scuc-qt-course/docs/teaching/examples/student_manager/README.md
T
张宗平 6d1895d696 教学示例补 5 个:3 个坑点复现 + QTableWidget + Day5 学员管理器参考实现
- 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,手工维护区不影响生成器
2026-07-05 12:49:20 +08:00

53 lines
2.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 学员信息管理器 —— Day5 综合案例参考实现
> 对应教案 [`OUTLINE_4DAY.md`](../../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 线程执行)。
## 验证方式(自测模式)
```bash
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 时段表)
1. 上午先讲界面骨架与数据层(自顶向下:先跑成品,再拆 MainWindow → 数据层);
2. 下午「后台导入」是提升重点:先把 `msleep` 挪进主线程按钮槽里演示界面冻结,
再回到 worker 版本对比——「卡与不卡」亲眼见一次胜过讲十分钟;
3. 每讲完一段,回指上表对应的 Day1–4 知识点,让学员意识到「项目 = 已学内容的组装」。
## 练习方向(供 Day6–10 项目热身)
- 加「删除选中行」(`currentRow` + `removeRow`);
- 保存前若有未保存修改,关窗时弹确认框(`closeEvent` + `QMessageBox::question`);
- 把成绩列改为按数值排序(提示:`QTableWidgetItem::setData(Qt::EditRole, double)`)。
## 参考
- 前身作业:[`../json_io/`](../json_io/README.md)Day4 数据落盘)、
[`../table_widget/`](../table_widget/README.md)Day4 表格)、
[`../qthread_worker/`](../qthread_worker/README.md)worker 模式最小版)