Files
张宗平 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
..

坑点复现:重复 connect 导致槽触发多次 —— 教学补充示例

对应教案 OUTLINE_4DAY.md Day2 下午 ★坑卡 「重复 connect 导致槽触发多次」。手工维护,非生成产物。

概念

connect 每调用一次就新增一条连接——Qt 不会去重。同一对信号槽连了两次, 信号一发槽就被调两次。典型事故现场:connect 写在会被多次执行的路径上 (每次打开对话框/每次刷新界面都跑一遍的「初始化」函数)。

现象非常有迷惑性:「点一次按钮弹两次框」——学员的第一反应是查按钮、查事件, 而根源在连接次数。

两种修复

  1. 把 connect 收拢到只执行一次的地方(构造函数)——首选,从结构上杜绝;
  2. Qt::UniqueConnection——同一对(发送者,信号,接收者,槽)只允许一条连接。 注意它只对成员函数指针有效:lambda 没有可比较的身份,UniqueConnection 对 lambda 连接不起作用(这是它常被误用的点)。

验证方式

QT_QPA_PLATFORM=offscreen tools/run_qt.sh qt_pitfall_double_connect   # 确定性输出:2 次 → 1 次,退出码 0

练习方向(供任务卡引用)

  • Popup::showOnce 换成 lambda 再加 Qt::UniqueConnection,验证「lambda 防不了重」;
  • showOnce 里打印 sender(),观察两次调用来自同一发送者的两条连接。

参考