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