# 坑点复现：重复 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` 一节，选读·需联网）
