教学示例补 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,手工维护区不影响生成器
This commit is contained in:
@@ -0,0 +1,52 @@
|
||||
# 学员信息管理器 —— 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 模式最小版)
|
||||
Reference in New Issue
Block a user