Files
scuc-qt-course/docs/teaching/OUTLINE_4DAY.md
T
张宗平 1053ebf41c 教案基准切换:新版 10 天安排 + 4 天版大纲(含中初级误区审计)
- docs/SCHEDULE_2026_10DAY.md:2026-07-05 新版 10 天安排正式文本,
  取代 TRAINING_PLAN_2026.md 旧执行计划作为课堂设计基准
- docs/teaching/OUTLINE_4DAY.md:4 天讲授 + Day5 综合案例的正式教案大纲,
  含逐天设计、旧主题去向决策(QSS→Day3、JSON→Day4、QThread→Day5 提升)、
  中初级学员误区盲点审计(10 张新坑卡:所有权/编码路径/连接语义三主线)、
  项目就绪度与高阶兴趣钩子评估
- OUTLINE.md 顶部加基准变更横幅,5 天版保留作历史参照与回退预案
- 顺带收编两篇此前未跟踪的自学文档 MODERN_CPP.md / MODERN_CPP_20PLUS.md
  (大纲与幻灯片多处链接它们)
2026-07-05 12:49:32 +08:00

30 KiB
Raw Blame History

4 天课堂设计(对齐 2026-07 新版 10 天安排)+ 中初级学员适配性评估

依据2026-07-05 收到的新版 10 天安排(正式全文见 docs/SCHEDULE_2026_10DAY.md,简表见 §0.1),取代 docs/TRAINING_PLAN_2026.md 的旧执行计划作为课堂设计基准。新安排本身就是 「4 天讲授(Day14+ Day5 综合案例讲解 + Day6–10 项目开发/答辩」结构, 因此本文即新基准下的正式教案大纲;此前对齐旧方案书的 5 天版 OUTLINE.md 保留作历史参照与素材库(其 24 张概念/坑卡在本文 全部复用)。幻灯片 day1.htmlday5.html 已按本文重排(§9 落地状态)。

0. 基准与显式假设(供随时纠偏)

0.1 新版 10 天安排(简表,讲授部分逐条对应)

时段 内容
1 上午讲 开训典礼;C++ 常用技术和框架(讲座);开发环境搭建;Makefile/CMake;面向对象基础回顾(类/对象/封装)
1 下午讲 C++ 核心特性(继承与多态、虚函数);内存管理(指针、引用与动态分配);STL 常用容器简介
2 上午讲 Qt 概述;创建 Qt 项目;第一个 Qt 小程序
2 下午讲 信号槽机制;项目案例:简易计算器
3 上午讲 QMainWindow;对话框 QDialog
3 下午讲 布局管理器;常用控件
4 上午讲 Qt 消息机制和事件;绘图事件及表格事件
4 下午讲 文件系统
5 全天 综合项目案例讲解(本文 §8 给出案例设计)
610 学员项目开发;Day10 下午项目答辩

每个半天的固定时段结构:08:3011:00 讲授(2.5h,产出=课堂代码+笔记+随堂练习)、 11:0012:00 课堂练习+工程师答疑1h);下午 13:3016:00 讲授16:0017:00 课堂作业+答疑1h)。

0.2 显式假设

  1. 受众:学员已掌握 C++ 基础语法与 OOP 概念,Day1 定位是「回顾和提升」。 仍用 PRETEST.md(10 题/10 分钟,双平行卷)实测:Day1 上午 「OOP 基础回顾」开讲前发卷,按结果决定回顾环节的推进速度(分层预案见 PRETEST)。
  2. 讲授块内部节奏:2.5h 纯讲对中初级学员超出注意力极限,本设计把每个讲授块 切成 34 个「讲 2530min + 随堂微练 1015min」循环(新安排的产出列本就 含「课堂练习」);11:00/16:00 后的整段练习时间做当天的任务卡。
  3. 新安排未点名的旧主题的处置(关键决策,§4 有完整对照):QSS 并入 Day3 下午 (新安排该时段目标明含「美化」);JSON 并入 Day4 下午(「用户数据的保存与读取」 的自然载体);表格用 QTableWidget 讲、Model/View 降为延伸钩子;QThread 移入 Day5 综合案例的「提升」环节(理由与风险见 §6);动画/状态机降为自学指针; Vcpkg 降为 CMake 环节的 1 分钟概念;OpenCV 移除(旧方案书本就标注可选)。
  4. 工具链沿用仓库现状:host gcc/g++ + CMake/NinjaPart1)、隔离 Qt 5.14.2Part3), 构建命令见根 README.mdMakefile 只在 Day1 讲「CMake 生成 构建系统」时作对照概念,不单独实操。

1. 四天总览(主题 → 仓库资产映射)

Day 上午 下午 当日作业产出
1 开训 + C++ 技术版图 + 环境/CMake CMakeLists.txt + OOP 回顾 p01/ch04 继承/多态/虚析构 p01/ch04/s08 + 内存管理 p01/ch03 + STL p01/ch09 Part1 全绿构建 + 2 道 C++ 改错题
2 Qt 概述 + 项目创建 + 第一个程序 p03/ch02 ch03 信号槽 p03/ch04 → 计算器案例 可运算的简易计算器
3 QMainWindow p03/ch05 + QDialog p03/ch06 布局/控件 p03/ch08 + QSS examples/qss_styling 计算器升级:主窗口化 + 美化
4 事件机制 p03/ch09 + 绘图 p03/ch10 + 表格 文件 IO p03/ch11 + JSON examples/json_io 本地数据存储小工具(写入→重启→读回)

四天作业刻意串成一条线:Day2 计算器 → Day3 给它套 QMainWindow+QSS → Day4 数据 落盘,Day5 综合案例是同一能力栈的完整版,学员进入 Day6 项目开发前已完整走过 3 轮「编码→构建→运行→演示」闭环。


2. 逐天设计

概念/坑卡标注:[沿用]= 取自 5 天版 OUTLINE.md 的同名卡片(内容不重抄, 以该文件为准);★[新增]= 本轮中初级误区审计(§5)补入的卡片,正文写全。

Day 1 上午:开训 / C++ 技术版图 / 环境与 CMake / OOP 回顾

讲授块切分(2.5h):

环节 内容 素材
开训典礼(≈40min,非教学) 团队/实训安排/考评要求 组织方主持
C++ 常用技术和框架(讲座 25min) 桌面(Qt)/后端/嵌入式/游戏四大版图;C++11→20 标准演进一页图(兴趣钩子→ MODERN_CPP.md 无仓库代码,讲座式
环境搭建 + CMake30min 讲 + 15min 随堂练) 用本仓库当真教材:-S -B 生成 / --build 编译两阶段;option()add_executableMakefile 是 CMake 的生成目标之一(对照概念);Vcpkg 一分钟概念 CMakeLists.txtp01/CMakeLists.txt
PRETEST 摸底(10min 发 A/B 卷,收卷即批 L1 题 PRETEST.md
OOP 基础回顾(30min,按摸底结果调速) 类/对象/封装;namespace 作用域 p01/ch04p01/ch03/namespace_syntax.cpp

概念/坑卡:CMake 项目构建[沿用]namespace 作用域[沿用]、外加——

  • 编译错误 vs 链接错误的排查分界:概念——error: 带文件行号是编译期(语法/ 类型),undefined reference 无行号是链接期(缺定义/缺库/缺目标文件),排查方向 完全不同;坑——中初级学员见到 undefined reference 习惯回头查语法,方向就错了。 此卡是 Day2「忘写 Q_OBJECT 报链接错」的前置铺垫。

11:0012:00 课堂练习:任务卡 1——独立完成 Part1 配置+构建 (cmake -S . -B build -G Ninja -DBUILD_QT_PART=OFF && cmake --build build 144 目标全绿,能说出 option(BUILD_QT_PART) 的作用)。

Day 1 下午:继承与多态 / 内存管理 / STL 简介

环节 内容 素材
继承/多态/虚函数(40min 讲 + 15min 练) 虚函数表机制、重写 vs 重载;虚析构与内存泄漏 p01/ch04/s08/virtual_dtor_purpose.cpp;函数重载 p01/ch03/function_overload_mechanism.cpp
内存管理(40min 讲 + 15min 练) 指针/引用/动态分配;引用的本质;所有权——谁负责 delete p01/ch03/reference_essence.cpp
STL 常用容器(25min 讲 + 15min 练) vector/map/string 三件套;迭代器统一接口 p01/ch05/class_template_basics.cppp01/ch09/s03/vector_iterator.cpp

概念/坑卡:函数重载决议[沿用]引用的本质[沿用]虚析构与内存 泄漏[沿用]模板与 STL 速览[沿用](含迭代器失效坑)、外加——

  • 所有权心智模型:谁负责 delete:概念——内存管理的核心问题不是「会不会 new」 而是「这块资源归谁管、由谁释放」,现代答案是 RAII/智能指针(unique_ptr 独占、 shared_ptr 共享,详见 MODERN_CPP.md §2);坑——双重释放、 忘记释放、释放后使用三兄弟全部源于所有权不明。本卡是 Day2 Qt 对象树的前置 铺垫:Qt 用父子所有权回答同一个问题,两套体系混用有专门的坑(Day2)。

16:0017:00 作业:从 docs/ERRATA.md 挑 2 条与今天知识点相关的记录(虚析构/引用 /重载类),在源文件里理解「wiki 原文错在哪、为什么」,各写一句话解释;选做——用 tools/std_probe.py 验证一个版本差异点(对照 docs/VERSION_NOTES.md)。

Day 2 上午:Qt 概述 / 创建 Qt 项目 / 第一个 Qt 小程序

环节 内容 素材
Qt 概述(25min Qt 是什么/能做什么;Qt 5.14 vs 系统 Qt 隔离(本仓库 .qt514/ 的做法);模块结构 Core/Gui/Widgets CMakeLists.txt 的 Qt 版本断言
创建 Qt 项目(30min 讲 + 15min 练) CMake 方式创建(find_package(Qt5)、AUTOMOC);构建开关 -DBUILD_QT_PART=ON p03/CMakeLists.txtp03/ch02/CMakeLists.txt
第一个 Qt 小程序(40min 讲 + 20min 练) QApplication + exec() 事件循环;控件创建与显示;QObject 对象树 p03/ch02/minimal_qt_app.cppp03/ch03/button_creation.cpp

概念/坑卡:最小 Qt 程序结构[沿用](含忘 Q_OBJECT 链接错——正好接 Day1 链接错误卡)、控件创建与显示[沿用](对象树/parent)、外加——

  • 栈对象与父子所有权打架:概念——Qt 父子树在 parent 析构时 delete 所有子 对象,这要求子对象必须建在堆上;坑——把带 parent 的控件建在栈上 (QPushButton btn(&window);),作用域结束栈析构一次、parent 再 delete 一次 → 双重释放崩溃。与 Day1 所有权卡呼应:Qt 树管的对象不要再用智能指针/栈/手动 delete 去管,一个对象只能有一个所有者。

11:0012:00 课堂练习:跑通 minimal_qt_appbutton_creation QT_QPA_PLATFORM=offscreen tools/run_qt.sh <target> 退出码 0);改造:窗口 标题、按钮文字换成自己的学号姓名(第一次触碰 QString 中文——为下午的编码卡埋点)。

Day 2 下午:信号槽机制 → 案例:简易计算器

环节 内容 素材
信号槽(50min 讲 + 20min 练) 观察者模式;内置/自定义/lambda 三种写法;新旧语法对比;连接方式 Direct/Queued/Auto p03/ch04/builtin_signal_slot.cppcustom_signal_slot.cpplambda_signal_slot.cpp
计算器案例(40min 带练) 数字/运算键盘 + 点击信号槽 + 结果显示;布局用教师提供的 QGridLayout 脚手架「先用后学」(布局原理 Day3 下午讲透,今天只求能排出键盘) p03/ch03 + p03/ch04 + 脚手架片段(授课时现场给出)

概念/坑卡:信号槽三种写法[沿用](含旧语法静默失败、QOverload 消歧义)、外加——

  • lambda 槽的生命周期与第五参数:概念——connect 第五参数(context object 决定连接的生存期,lambda 槽应传 context,对象销毁连接自动断开;坑——lambda 按引用 捕获局部变量、或捕获 this 而不传 context,对象销毁后信号再来就是悬空访问——这是 从「能用 lambda」到「敢在项目里用 lambda」之间最大的坑。
  • 重复 connect 导致槽触发多次:概念——connect 每调一次新增一条连接,同一对 信号槽连两次槽就被调两次(Qt::UniqueConnection 可防重);坑——把 connect 写在 会被多次执行的函数里,现象是「点一次按钮弹两次框」,学员往往去查按钮而不是查连接。
  • QString 与中文编码:概念——QString 内部是 UTF-16,与 std::string(字节串) 互转要经 toUtf8()/fromUtf8();坑——源码不存成 UTF-8、或用 QString(char*) 隐式转换中文字面量,界面就是乱码。中文教学环境第一天写界面必踩,上午练习的 学号姓名改造就是现场复现点。

16:00–17:00 作业:完成计算器——至少支持两个数 + 加减乘除,结果正确显示在 QLabel/QLineEdit;界面不重叠、按钮可点击(验收同 5 天版计算器任务卡 1)。

Day 3 上午:QMainWindow / 对话框 QDialog

环节 内容 素材
QMainWindow45min 讲 + 20min 练) 主窗口架构:菜单栏/工具栏/状态栏/中心部件/停靠窗 p03/ch05/central_widget.cppdock_widget.cpp
QDialog45min 讲 + 20min 练) 模态 vs 非模态(三种非模态写法对比:栈/堆/WA_DeleteOnClose);标准对话框 QMessageBox/QFileDialog p03/ch06/modal_dialog.cppmodeless_dialog_stack.cppmodeless_dialog_heap.cppmodeless_dialog_deleteonclose.cppmessage_box_question.cppfile_dialog.cpp

概念/坑卡(本节两张为本文新写,5 天版未覆盖 ch05/ch06):

  • QMainWindow 结构:概念——QMainWindow 不是「大号 QWidget」,它有固定的区域 布局协议(菜单/工具/状态/中心/停靠各就其位),中心部件必须 setCentralWidget 显式安放;坑——直接往 QMainWindow 上 addWidget/摆控件而不设中心部件,布局行为 不可预期;菜单动作 QAction 忘了 connect 到槽,菜单显示正常点了没反应。
  • 模态与非模态的生命周期:概念——模态 exec() 阻塞等结果、返回值即用户选择; 非模态 show() 立即返回,对话框对象必须活过函数作用域(堆 + parent,或 WA_DeleteOnClose 自清理);坑——栈上建非模态对话框 show() 完函数一返回就 析构,窗口一闪而过——p03/ch06 三个 modeless 版本正是这个坑的对照教材,也是 Day2 栈/堆所有权卡的第三次复现。

11:00–12:00 课堂练习:给昨天的计算器套上 QMainWindow——加菜单「帮助→关于」弹 QMessageBox;加一个「历史」停靠窗(可先放空 QLabel)。

Day 3 下午:布局管理器 / 常用控件(+QSS 美化)

环节 内容 素材
布局管理器(40min 讲 + 15min 练) QHBox/QVBox/QGrid;嵌套布局;伸缩因子——回收 Day2 计算器脚手架,讲透当时「先用后学」的部分 p03/ch08/custom_widget.cpp
常用控件(35min 讲 + 15min 练) QLabel 文本/HTML/图片、QLineEdit、按钮族;资源系统 .qrc p03/ch08/label_text_html.cpplabel_pixmap.cpplabel_movie.cpp
QSS 界面美化(25min 讲 + 20min 练) 选择器/伪状态/层叠——对应新安排「自适应排版及美化」目标 docs/teaching/examples/qss_styling/qt_qss_styling.cpp + README

概念/坑卡:布局管理[沿用](同控件不能属两个布局;布局后 setGeometry 被 覆盖)、资源系统 .qrc[沿用](路径静默失败/AUTORCC)、QSS 美化[沿用] ID 选择器要 setObjectNamesetStyleSheet 级联失控)。

16:00–17:00 作业:计算器升级——数字键/运算键/等号键用 QSS 区分颜色,至少 1 个按钮 有 :hover:pressed 效果;整体布局改为可随窗口缩放(验收同 5 天版 QSS 任务卡)。

Day 4 上午:Qt 消息机制和事件 / 绘图事件及表格事件

环节 内容 素材
事件循环与派发(35min 讲 + 15min 练) exec() 事件循环回收 Day2 概念;事件 vs 信号槽两套机制;主线程阻塞=界面冻结(为 Day5 QThread 提升埋点) p03/ch02/minimal_qt_app.cpp
事件拦截(30min 讲 + 15min 练) 重写 xxxEvent() vs installEventFilter()accept()/ignore() 传播 p03/ch09/event_override_customwidget.cppevent_filter_mainwindow.cppmouse_event.cpp
绘图事件(30min 讲 + 15min 练) paintEvent + QPainterupdate() 异步重绘;绘图设备一瞥 p03/ch10/qpainter_basic.cpp(设备类 paint_device_*.cpp 作参考)
表格(15min 演示) QTableWidget 单元格填充与 cellClicked/itemChanged 事件(item 类控件够项目用);Model/View 架构一页概念 + 延伸钩子 docs/teaching/examples/table_widget/qt_table_widget_basics.cppM/V 钩子:examples/model_view/

概念/坑卡:事件循环:事件 vs 信号[沿用]自定义事件处理/事件过滤器 [沿用](重写忘调基类丢默认行为)、QPainter 绘图[沿用]paintEvent 之外绘制 UB;忘 update() 不重画)、Model/View 架构[沿用,降为概念页]

11:00–12:00 课堂练习:给控件装事件过滤器拦截鼠标按下并打印坐标;在 paintEvent 里画一个组合图形(棋盘格或仪表盘刻度)。

Day 4 下午:文件系统(+JSON)

环节 内容 素材
文件读写(40min 讲 + 20min 练) QFile/QTextStream/QDataStreamQIODevice 统一抽象 p03/ch11/qfile_basic.cppqtextstream_io.cppqdatastream_io.cpp
JSON 解析与写入(35min 讲 + 20min 练) round-trip 正确性标准;QJsonDocument/Object/Array/Value docs/teaching/examples/json_io/qt_json_parse_write.cpp + README

概念/坑卡:QIODevice 统一读写抽象[沿用]open() 不检查静默失败)、 JSON 序列化/反序列化[沿用]QJsonParseError 不检查静默空文档;类型不匹配 返回默认值不报错)、外加——

  • 相对路径与工作目录:概念——QFile("data.json") 的相对路径基于进程当前 工作目录,不是源码目录也不一定是可执行文件目录;IDE、终端、tools/run_qt.sh 三种跑法工作目录可能各不相同;坑——「IDE 里能读到文件,命令行跑就说不存在」, 中初级学员几乎必问。正解:QCoreApplication::applicationDirPath() 拼路径,或 只读资源走 .qrc(呼应 Day3 资源卡)。
  • 文本编码再遇(文件版):概念——QTextStream 默认编码随平台/区域设置而变 (Qt 5 默认本地编码),跨平台交换文本必须显式 setCodec("UTF-8");坑——Windows 写的文件 Linux 读出乱码(或反过来)。与 Day2 的 QString 编码卡同根源、隔两天 第二次出现,刻意间隔重复形成「编码要显式指定」的条件反射。

16:00–17:00 作业:本地数据存储小工具——「学员信息」结构(姓名/成绩/标签)增加记录 并保存到 JSON 文件,重启程序读回全部记录(至少 2 条、字段不丢,验收同 5 天版 存储任务卡 2)。这是 Day5 综合案例的直接前身。


3. Day5 综合项目案例讲解(全天,衔接设计)

新安排 Day5 的目标是「通过综合案例讲解 Qt 开发流程、规范及方法」。建议案例: 「学员信息管理器」——把四天作业线收束成完整小软件,正好覆盖全部已学内容并 补上项目开发前的最后三块拼图:

时段 内容 覆盖
上午 1 需求拆解 → 界面骨架:QMainWindow + 菜单/工具栏 + QTableWidget 列表 + 增改对话框 Day3 全部 + Day4 表格
上午 2 数据层:记录结构 ↔ QJson 序列化 ↔ 落盘读回;信号槽把界面和数据接起来 Day4 下午 + Day2
下午 1 提升:QThread 防卡界面——导入大文件时界面不冻结(worker 对象模式、跨线程不碰 GUI) docs/teaching/examples/qthread_worker/ + README(旧 5 天版 D4A 的概念/坑卡照用)
下午 2 开发流程与规范:Git 提交粒度(对应任务粒度、信息可追溯,忌"update");代码走查怎么做;考评三维度(管理/技术/素养);分组定项目方向 docs/TRAINING_PLAN_2026.md 质量保证节 + docs/images/ 三图
兴趣钩子(穿插) 动画/状态机各 5min 演示(给界面加转场动效的方向) examples/property_animation/state_machine/

QThread 放 Day5 而非砍掉的理由:「主线程阻塞=界面冻结」是学员项目里最高频的 崩溃/卡死来源,新安排 Day1–4 没有它的位置,但综合案例的「导入数据」情节是它 最自然的出场时机;且 Day4 上午事件循环卡已埋点,Day5 只需 60–70 分钟就能讲透 worker 模式三件套(亲和性/moveToThread 时序/跨线程信号槽自动 Queued)。


4. 评估 A:新安排条目覆盖核对 + 旧主题去向

新安排讲授条目 → 本设计位置:逐条对齐(§2 各表第一列即新安排原文条目), 无遗漏;「Makefile/CMake」按 §0.2 假设 4 以 CMake 实操为主、Makefile 为对照概念。

旧 5 天版有、新安排未点名的主题的去向

旧主题 去向 理由
QSS 美化 Day3 下午(正式讲授) 新安排 Day3 下午目标原文含「美化」;且计算器案例线需要它
JSON Day4 下午(正式讲授) 「用户数据的保存与读取」的事实标准载体;项目实作必用
Model/View Day4 上午概念页 + 延伸钩子 项目层面 QTableWidget 够用;完整 M/V 对中初级学员超纲
QThread 多线程 Day5 提升环节(保留讲授) 见 §3 论证;完全砍掉是项目期最大风险点
动画/状态机 Day5 钩子 + 自学指针 项目使用频率低;示例与 README 完整保留
Scrum/团队协同/考核标准 开训典礼(组织方)+ Day5 下午 2 讲授权重下调,但 Git 习惯与考评三维度保留在进项目前最后一课
Vcpkg Day1 CMake 环节 1 分钟概念 新安排未点名;保留「包管理器是什么」的认知即可
OpenCV 移除(不再作自学指针占课时) 旧方案书即标注可选;新安排无此条

5. 评估 B:中初级学员常见误区/盲点覆盖审计(核心交付)

审计画像:「有一定 C++ 基础」= PRETEST L1 全对、L2 部分对的学员。逐条核对三个 层面的高频误区是否有对应「概念/坑」卡。✔=沿用 5 天版已覆盖卡;★=本轮新增; ☆=本文为 ch05/ch06 新写;—=有意不覆盖(附理由)

C++ 语言层(Day1 集中处理)

误区/盲点 覆盖 位置
引用可空/可重绑、值传递 vs 引用传递、悬空引用 Day1 下午 + PRETEST L1
虚析构缺失泄漏、多态机制、重写 vs 重载 Day1 下午 + PRETEST L2/L3
重载决议二义性、隐式转换扩大候选集 Day1 下午 + PRETEST L2
迭代器失效 Day1 下午 STL 卡
头文件 using namespace 污染 Day1 上午 namespace 卡
「谁负责 delete」所有权模型缺失 Day1 下午新卡(内存管理环节,位置比旧版更贴切)
编译错误 vs 链接错误分不清 Day1 上午新卡
static 初始化顺序、const 细则、移动语义细节 项目实作用不到临界深度;MODERN_CPP.md 作自学

Qt 框架层(Day24 + Day5

误区/盲点 覆盖 位置
Q_OBJECT → 链接错且不提宏 Day2 上午(有 Day1 链接卡打底)
exec() 窗口一闪而过、多个 QApplication Day2 上午
忘传 parent 泄漏 Day2 上午
栈上建带 parent 的控件 → 双重释放 Day2 上午新卡
非模态对话框建在栈上一闪而过 Day3 上午新卡(同一所有权误区第三次复现,ch06 三个 modeless 对照文件是现成教材)
lambda 槽捕获悬空 / 缺 context 参数 Day2 下午新卡
重复 connect → 槽触发多次 Day2 下午新卡
旧字符串语法静默失败、重载信号消歧义 Day2 下午
QString/std::string 混淆、中文乱码 Day2 下午新卡(上午练习已现场埋复现点)
QMainWindow 不设中心部件、QAction 忘连接 Day3 上午新卡
同控件属两个布局、布局后手动 setGeometry 被覆盖 Day3 下午
.qrc 路径错静默失败 Day3 下午
QSS 级联失控、ID 选择器要 objectName Day3 下午
重写事件函数忘调基类 Day4 上午
paintEvent 之外绘制 UB、忘 update() Day4 上午
改模型不发信号视图不刷新 ✔(概念页) Day4 上午
open() 不检查、JSON 解析错误静默 Day4 下午
相对路径随工作目录漂移 Day4 下午新卡
QTextStream 默认编码平台相关 → 跨机乱码 Day4 下午新卡
工作线程碰 GUI 崩溃、moveToThread 时序 Day5 提升环节(Day4 上午已埋「阻塞=冻结」认知)
Qt Designer/.ui 工作流 本课程纯代码路线(仓库示例均无 .ui);项目期按需补

工程/协作层

误区/盲点 覆盖 位置
CMake「生成 vs 构建」两阶段混淆 Day1 上午
新标准特性 ≠ 工具链可用 Day1 讲座钩子 + std_probe.py 作业选做
commit 粒度失控、信息写"update" Day5 下午 2(进项目前最后一课,即时生效)
只重技术忽略考评其余维度 Day5 下午 2

审计结论:共 10 张新卡(★8 + ☆2),集中三条主线:①所有权与生命周期 (谁 delete → 栈控件双重释放 → 非模态对话框一闪而过 → lambda 捕获悬空,四天内 四次复现同一心智模型,这是「学过 C++ 语法」与「写得出不崩的 Qt 程序」之间最大的 鸿沟);②编码与路径(中文乱码 Day2 → 文件乱码 Day4 → 工作目录 Day4,中文教学 环境必踩且旧版完全空白);③连接语义(重复 connect、context 参数,现象诡异、 自查困难,教了能省项目期大量答疑)。新安排把 C++ 扩到整天,反而让 ①在 Day1 就能 立住地基——比旧 5 天版(C++ 只有半天)对中初级学员更友好。

6. 评估 C:Day6–10 项目开发就绪度

项目必备能力 训练强度 位置
主窗口+菜单+对话框的标准桌面骨架 讲+练+案例 Day3 + Day5
控件/布局/美化 讲+练+作业(计算器线) Day23
对象间通信(信号槽三种写法) 讲+练 Day2
数据持久化(JSON round-trip 讲+练+作业+案例 Day45
表格类数据展示 演示+案例 Day45
事件拦截/自绘 讲+练 Day4
耗时操作不卡 UI 讲+案例(Day5 提升) Day4 埋点 + Day5
崩溃自查(所有权/编码/连接三主线) 10 张坑卡 + 四次间隔复现 Day14 贯穿
Git/流程/考评认知 Day5
综合组装 全程案例走查 Day5

结论:就绪度充分,且作业线(计算器→主窗口化→数据落盘→综合案例)保证每个学员 进项目前至少完成 3 个递进的可运行程序。两个前提条件:① PRETEST 摸底通过(不通过 则触发 PRETEST 分层预案,Day1 下午减少 STL 时长、加固 OOP);② Day5 必须保住 QThread 提升环节——若 Day5 案例讲解超时挤掉它,项目期「界面冻结/跨线程崩溃」 答疑成本会数倍返还,这是本设计标记的最高优先级保底项。

7. 评估 D:高阶兴趣钩子(每处 1–2 分钟点到 + 自学入口)

Day 钩子(挂在当天刚学的内容上) 自学入口
1 C++ 不是停滞的语言:11「几乎新语言」→ 20 四大件 → 26 反射;现场用 std_probe.py 编译验证一个新特性 MODERN_CPP.mdMODERN_CPP_20PLUS.md(含本机 GCC 实测矩阵)
2 信号槽的幕后:打开 build/ 里真实的 moc_*.cpp 看 moc 生成了什么 本仓库构建产物 + Qt 元对象系统文档
3 QSS 与前端 CSS 的同源关系;Qt Designer/QML 是另一条 UI 路线 Qt 官方 Style Sheets 文档
4 今天的 QTableWidget 背后是完整的 Model/View 架构(数据/展示彻底解耦、一模型多视图) examples/model_view/ + Qt Model/View 长文
5 QtConcurrent/线程池是 QThread 的更高抽象;动画/状态机给界面加转场 examples/property_animation/state_machine/MODERN_CPP_20PLUS.md §协程

设计原则:钩子全部是当天内容的自然延伸(学了信号槽→看 moc 产物;学了表格→ 看 Model/View),不做空降的「高级话题清单」——好奇心要挂在已有的钩子上。

8. 风险与缓解

风险 缓解
2.5h 讲授块对中初级学员过长 §0.2 假设 2 的「讲 25–30 + 练 10–15」循环切分;随堂微练全部有明确产出(跑通/改造/复现坑)
Day2 下午计算器早于布局课(新安排固有顺序) 教师提供 QGridLayout 脚手架「先用后学」,Day3 下午回收讲透;脚手架片段随幻灯片提供
Day5 案例讲解超时挤掉 QThread 提升 上午严格按 §3 时段推进;万一超时,砍动画/状态机钩子而非 QThread(§6 保底项)
PRETEST 摸底不达标 Day1 下午 STL 环节让位 OOP 加固(PRETEST 分层预案);新安排 C++ 占整天,回旋余地本就比旧 5 天版大
表格环节无现成 QTableWidget 示例(已解决) 已补 examples/table_widget/qt_table_widget_basics.cpp,离屏验证通过

9. 落地清单(2026-07-05 已全部执行)

  1. 幻灯片重排day1.htmlday5.html 已按本文 §2/§3 重组(Day1 全 C++、Day3 新增 ch05/ch06、Day5 改综合案例结构);10 张新卡已按 custom.css 现有 .concept-box/.pitfall-box 样式补入(幻灯片内标注 ★/☆),「大纲↔幻灯片 一一对应」约定保持。
  2. 坑点最小复现示例已补入 docs/teaching/examples/(手工维护区,不影响生成器): pitfall_stack_widget--crash 触发真实双重释放崩溃)、pitfall_lambda_capture --dangle 触发真实悬空访问)、pitfall_double_connect(确定性 2 次→1 次对比)、 table_widgetQTableWidget 最小示例)。默认运行均为正确写法、离屏验证退出码 0。
  3. Day5 综合案例参考实现docs/teaching/examples/student_manager/ QMainWindow + QTableWidget + 对话框 + JSON round-trip + QThread 后台导入; 离屏自测模式自动校验「写入→读回」与导入闭环)。
  4. 新 10 天安排正式文本已落入 docs/SCHEDULE_2026_10DAY.md OUTLINE.md §0 与幻灯片 index.html 已补两版关系说明。