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

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

## 覆盖的知识点（讲解时逐条回指）

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

## 验证方式（自测模式）

```bash
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`](../../OUTLINE_4DAY.md) Day2 下午「16:00–17:00 作业」与
`slides/day2.html` 任务卡 2；本参考实现即该作业的教师侧标准答案，**不要在课上
直接展示源码给学生抄**，讲解思路后学生自己实现。

## 参考

- 布局脚手架来源：`p03/ch08/custom_widget.cpp`（`QHBoxLayout`/`QSlider` 联动）
- 信号槽写法来源：`p03/ch04/`（`builtin_signal_slot.cpp`、`custom_signal_slot.cpp`、
  `lambda_signal_slot.cpp`）
- Designer 表单对照版：[`../calculator_designer/`](../calculator_designer/README.md)
