Qt 槽函数被执行多次,并且使用Qt::UniqueConnection无效【已解决】
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;它仅适用于连接到成员函数。
二、解决方案
delete
QObject实例,并不会
自动断开所有与之关联的信号和槽连接. 以下有三种解决方案:
-
- 手动调用
disconnect()
断开相关信号和槽
- 手动调用
-
- 修改代码逻辑,保证其只连接一次
-
- 槽函数改为
成员函数
(使用Qt::UniqueConnection
需注意槽函数只能是成员函数
)
- 槽函数改为
参考链接:
- Qt::UniqueConnection和lambda一块用无效:https://blog.csdn.net/weixin_46537765/article/details/134851130
- 槽函数被执行多次的解决方法及Qt::UniqueConnection作用及和其它连接类型的“与”操作写法:https://blog.csdn.net/danshiming/article/details/123162126
- Qt槽函数会被执行多次的问题原因及解决方法:https://blog.csdn.net/m0_52467164/article/details/131069560
- Qt 多线程场景下,信号与槽绑定时采用Lamda表达试的一些坑:https://blog.csdn.net/sinat_15030309/article/details/147890907
- Qt中信号未与槽函数断连就delete的问题:https://blog.csdn.net/weixin_45428995/article/details/141217712
三、深入了解信号和槽绑定机制
参考链接:
- QT中关于信号与槽机制的实现原理:https://blog.csdn.net/zht_xml/article/details/248738
05年的老博客,每个QObject类都有一个QMetaObject类记录其元对象信息,然后利用元对象信息实现信号与槽机制,包括连接的建立和信号发生时激活的操作函数
为什么Qt::UniqueConnections
只适用于成员函数?难道只有QObject类的成员函数才会被记录元对象连接信息? - 比如Lambda表达式是一个匿名函数,即没有函数名,所以没法被记录么? 待深入了解其实现机制…
- 深入理解 Qt 信号与槽机制:原理、用法与优势:https://baijiahao.baidu.com/s?id=1823983825208540075
编译阶段MOC (Meta - Object Compiler,元对象编译器) 会生成一个新的 C++ 源文件(通常命名为moc_<类名>.cpp)
- 元对象系统 MOC(Meta-Object Compiler 元对象编译器) :https://blog.csdn.net/cloud323/article/details/140185088
深入理解仿函数(Functors):从概念到实践: https://blog.csdn.net/2302_80836956/article/details/147892182 ↩︎