Files
张宗平 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

2.8 KiB
Raw Permalink Blame History

学员信息管理器 —— 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))。

参考