# 坑点复现:重复 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` 一节,选读·需联网)