如何发现一个信号是否与任何东西相连



是否有一种方法来告诉信号是否已经连接到一个功能?

。我想看看它的信号。siSelectionChange连接到任何

signals.siSelectionChange.connect( self.SelAsSiAssets )

您可以使用QObject.receivers获取连接函数的计数。我使用它的方式如下,在QWidget的closeEvent()中,我使用as窗口:

    receiversCount = self.receivers(QtCore.SIGNAL("siSelectionChanged()"))
    if receiversCount > 0:
        self.sigChanged.disconnect()

注意参数字符串中的签名必须与实际签名匹配

因为我尝试了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

相关内容

最新更新