Qt 槽函数被执行多次,并且使用Qt::UniqueConnection无效【已解决】

发布于:2025-08-03 ⋅ 阅读:(16) ⋅ 点赞:(0)

Qt 槽函数被执行多次,并且使用Qt::UniqueConnection无效

引言

之前刚遇到 - 信号和槽正常连接返回true,但发送信号后槽函数无响应问题,现在又遇到槽函数执行多次,使用Qt::UniqueConnection无效的问题… 有意思!

一、问题描述

  • 在函数a中new了一个类的实例,然后连接其信号和槽 (使用Lamda表达式实现槽函数),程序运行一段时间delete这个实例,然后又执行函数a重新new了另一个实例,重新连接其信号和槽. 然后发现槽函数被多次执行.
  • Note: Qt::UniqueConnections do not work for lambdas, non-member functions and functors; they only apply to connecting to member functions.
  • 注意:Qt::UniqueConnections不适用于lambda表达式、非成员函数和仿函数1;它仅适用于连接到成员函数。

二、解决方案

deleteQObject实例,并不会自动断开所有与之关联的信号和槽连接. 以下有三种解决方案:

    1. 手动调用disconnect()断开相关信号和槽
    1. 修改代码逻辑,保证其只连接一次
    1. 槽函数改为成员函数 (使用Qt::UniqueConnection需注意槽函数只能是成员函数)

参考链接:

三、深入了解信号和槽绑定机制

参考链接:

    1. QT中关于信号与槽机制的实现原理:https://blog.csdn.net/zht_xml/article/details/248738
      05年的老博客,每个QObject类都有一个QMetaObject类记录其元对象信息,然后利用元对象信息实现信号与槽机制,包括连接的建立和信号发生时激活的操作函数
      为什么Qt::UniqueConnections只适用于成员函数?难道只有QObject类的成员函数才会被记录元对象连接信息? - 比如Lambda表达式是一个匿名函数,即没有函数名,所以没法被记录么? 待深入了解其实现机制…
    1. 深入理解 Qt 信号与槽机制:原理、用法与优势:https://baijiahao.baidu.com/s?id=1823983825208540075
      编译阶段MOC (Meta - Object Compiler,元对象编译器) 会生成一个新的 C++ 源文件(通常命名为moc_<类名>.cpp)
    1. 元对象系统 MOC(Meta-Object Compiler 元对象编译器) :https://blog.csdn.net/cloud323/article/details/140185088

  1. 深入理解仿函数(Functors):从概念到实践: https://blog.csdn.net/2302_80836956/article/details/147892182 ↩︎