如何判断信号是否连接到任何东西

7 投票
2 回答
10276 浏览
提问于 2025-04-17 06:30

有没有办法判断一个信号是否已经连接到某个函数上呢?

比如说,我想知道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()

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

撰写回答