Files
张宗平 d0496675e9 student_manager 教学示例:菜单/工具栏加「删除选中」action(函数体待实现)
「记录」菜单与工具栏新增 actRemoveSelected(删除选中),connect 到 onRemoveSelected
槽。注意:onRemoveSelected() 函数体当前为空(实现被注释),仅完成 action 注册与
连接——槽逻辑(按选中行倒序 removeRow)留作课堂练习或后续补全,先占位。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-09 16:51:49 +08:00
..

学员信息管理器 —— 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、 moveToThreadstart() 之前、跨线程信号→主线程槽自动 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 时段表)

  1. 上午先讲界面骨架与数据层(自顶向下:先跑成品,再拆 MainWindow → 数据层);
  2. 下午「后台导入」是提升重点:先把 msleep 挪进主线程按钮槽里演示界面冻结, 再回到 worker 版本对比——「卡与不卡」亲眼见一次胜过讲十分钟;
  3. 每讲完一段,回指上表对应的 Day1–4 知识点,让学员意识到「项目 = 已学内容的组装」。

练习方向(供 Day6–10 项目热身)

  • 加「删除选中行」(currentRow + removeRow);
  • 保存前若有未保存修改,关窗时弹确认框(closeEvent + QMessageBox::question);
  • 把成绩列改为按数值排序(提示:QTableWidgetItem::setData(Qt::EditRole, double))。

参考