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

38 lines
1.7 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.
# 坑点复现:重复 connect 导致槽触发多次 —— 教学补充示例
> 对应教案 [`OUTLINE_4DAY.md`](../../OUTLINE_4DAY.md) Day2 下午 ★坑卡
> 「重复 connect 导致槽触发多次」。手工维护,非生成产物。
## 概念
`connect` 每调用一次就**新增一条**连接——Qt 不会去重。同一对信号槽连了两次,
信号一发槽就被调两次。典型事故现场:`connect` 写在会被多次执行的路径上
(每次打开对话框/每次刷新界面都跑一遍的「初始化」函数)。
现象非常有迷惑性:「点一次按钮弹两次框」——学员的第一反应是查按钮、查事件,
而根源在连接次数。
## 两种修复
1. **把 connect 收拢到只执行一次的地方**(构造函数)——首选,从结构上杜绝;
2. `Qt::UniqueConnection`——同一对(发送者,信号,接收者,槽)只允许一条连接。
**注意它只对成员函数指针有效**:lambda 没有可比较的身份,UniqueConnection
对 lambda 连接不起作用(这是它常被误用的点)。
## 验证方式
```bash
QT_QPA_PLATFORM=offscreen tools/run_qt.sh qt_pitfall_double_connect # 确定性输出:2 次 → 1 次,退出码 0
```
## 练习方向(供任务卡引用)
-`Popup::showOnce` 换成 lambda 再加 `Qt::UniqueConnection`,验证「lambda
防不了重」;
-`showOnce` 里打印 `sender()`,观察两次调用来自同一发送者的两条连接。
## 参考
- 本仓库对照:[`p03/ch04/custom_signal_slot.cpp`](../../../../p03/ch04/custom_signal_slot.cpp)
- Qt 官方文档:`QObject::connect``Qt::ConnectionType` 一节,选读·需联网)