Files
张宗平 05a685c952 Day3 教学示例:增强版计算器接入 + QMainWindow/QSS 两版参考实现
- calculator_designer_ext(Day2 增强版:表达式求值 + 括号,递归下降解析器)接入 cmake
- calculator_mainwindow(Day3 上午):增强版计算器装进 QMainWindow,
  菜单/状态栏/历史停靠窗,纯代码 + 显式 connect,与 mainwindow_showcase 形成坑卡对照
- calculator_mainwindow_qss(Day3 下午):上午版 + QSS 双主题美化(按键分色/伪状态/深浅切换)
- 验证 mainwindow_showcase(QMainWindow 六大组件综合演示,.ui + .qrc)
- OUTLINE_4DAY.md / ASSIGNMENTS.md Day3 衔接增强版起点 + 参考实现指引
- 补提交 Day2 calculator/ 与 calculator_designer/ 参考实现(CMakeLists 已引用)
- 全量构建 28/28,4 目标离屏自测退出码 0

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-07 22:59:05 +08:00
..

简易计算器 —— Day2 下午案例参考实现(代码布局版)

对应教案 OUTLINE_4DAY.md Day2 下午「信号槽机制 → 项目案例:简易计算器」。教师侧参考答案,手工维护,非生成产物。 Designer 表单对照版见 ../calculator_designer/

覆盖的知识点(讲解时逐条回指)

环节 知识点 首次出现
界面骨架 QGridLayout 排数字/运算符键盘 Day2 下午(脚手架先用后学,Day3 下午讲透原理)
信号槽写法 1 lambda + 第五参数 context(数字/运算符键批量绑定) Day2 下午
信号槽写法 2 成员函数指针连接(等号/清空/退格键) Day2 下午
坑点规避 所有 connect 只在构造函数执行一次,不留「重复 connect」隐患 Day2 ★坑卡
编码 中文/符号按钮文字 QStringLiteral + 源文件 UTF-8 Day2 ★坑卡
状态机 数字/小数点/运算符/等号/清空/退格 六类输入的最小状态机;连续按运算符走「链式计算」;除零给出 Error 而不崩溃 案例本身

验证方式(自测模式)

QT_QPA_PLATFORM=offscreen tools/run_qt.sh qt_calculator
# 自测流程:直接调用与按钮绑定的同一批处理函数(等价于点击),依次验证
# 「7+3=10」「6÷0=Error」「4.5+0.5=5」「12 退格→1」「2+3+4=9(链式运算)」
# 全部通过退出码 0,任一步失败退出码 1
tools/run_qt.sh qt_calculator    # 有 X 环境:完整交互

课堂讲解建议

  1. 先跑成品:现场敲一次「7 + 3 =」,再回头拆代码——项目 = 已学知识点的组装;
  2. 重点讲两种 connect 写法的取舍:数字/运算符键数量多、逻辑相同,用 lambda 捕获参数 + 统一槽函数(onDigit(int)/onOperator(QChar)); 等号/清空/退格各自唯一,直接用成员函数指针更直观;
  3. 现场移除某个按钮的 connect,演示"按钮显示正常、点击没反应"——呼应 QAction 忘 connect 的坑(Day3 会再见到同一类问题);
  4. 除零处理是刻意设计的教学点:不用 assert/崩溃,而是给出可恢复的错误状态 Error + 下一次输入自动清空),这是「健壮性」在中初级学员能理解层面的 最小示范。

练习方向(对应任务卡 2 · 课后作业)

OUTLINE_4DAY.md Day2 下午「16:0017:00 作业」与 slides/day2.html 任务卡 2;本参考实现即该作业的教师侧标准答案,不要在课上 直接展示源码给学生抄,讲解思路后学生自己实现。

参考

  • 布局脚手架来源:p03/ch08/custom_widget.cppQHBoxLayout/QSlider 联动)
  • 信号槽写法来源:p03/ch04/builtin_signal_slot.cppcustom_signal_slot.cpplambda_signal_slot.cpp
  • Designer 表单对照版:../calculator_designer/