Files
scuc-qt-course/docs/teaching/examples/calculator/README.md
T
张宗平 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

52 lines
3.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 简易计算器 —— 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:0017: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)