如何查找信号是否连接到任何东西

问题描述 投票:0回答:3

有没有办法判断信号是否已经连接到函数?

即我想看看 Signals.siSelectionChange 是否连接到任何东西

signals.siSelectionChange.connect( self.SelAsSiAssets )
python qt pyqt signals slot
3个回答
12
投票

您可以使用

QObject.receivers
来获取连接函数的数量。我使用它如下,在 QWidget 的
closeEvent()
中,我用作窗口:

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

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


10
投票

自从我用 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

0
投票

最新答案:

QObject
(小部件)有一个方法
isSignalConnected
,可以这样使用:

if tabelWidget.isSignalConnected(QtCore.QMetaMethod.fromSignal(tabelWidget.itemChanged)):

其中

itemChanged
是信号,如果信号已连接则返回 True

© www.soinside.com 2019 - 2024. All rights reserved.