# 学员信息管理器 —— 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 模式最小版）
