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 ??