如何判断信号是否连接到任何东西
有没有办法判断一个信号是否已经连接到某个函数上呢?
比如说,我想知道signals.siSelectionChange这个信号是否已经连接到任何东西上。
signals.siSelectionChange.connect( self.SelAsSiAssets )
2 个回答
8
我尝试在PyQt5中使用这个方法,但发现没有QtCore.SIGNAL
这个东西。我用QObject的isSignalConnected
方法试了一下。不过,使用这个方法时你会遇到另一个问题,就是在PyQt5库中没有QMetaMethod.fromSignal
。
所以,我写了一个getSignal
函数。
from PyQt5.QtCore import QMetaMethod
from PyQt5.QtCore import QObject
def getSignal (oObject : QObject, strSignalName : str):
oMetaObj = oObject.metaObject()
for i in range (oMetaObj.methodCount()):
oMetaMethod = oMetaObj.method(i)
if not oMetaMethod.isValid():
continue
if oMetaMethod.methodType () == QMetaMethod.Signal and \
oMetaMethod.name() == strSignalName:
return oMetaMethod
return None
from PyQt5.QtCore import pyqtSignal
if __name__ == "__main__":
class A (QObject):
sigB = pyqtSignal()
def __init__ (self):
super().__init__()
oA = A ()
print ("is 'sigB' connected:", oA.isSignalConnected (getSignal(oA, "sigB")))
oA.sigB.connect (lambda : print("sigB emitted!"))
oA.sigB.emit()
print ("is 'sigB' connected:", oA.isSignalConnected (getSignal(oA, "sigB")))
输出:
is 'sigB' connected: False
sigB emitted!
is 'sigB' connected: True
11
你可以使用 QObject.receivers
来获取连接的函数数量。我在一个 QWidget 的 closeEvent()
方法中这样使用,作为窗口:
receiversCount = self.receivers(QtCore.SIGNAL("siSelectionChanged()"))
if receiversCount > 0:
self.sigChanged.disconnect()
请注意,参数字符串中的签名必须与实际的签名匹配。