【问题标题】:How to find if a signal is connected to anything如何查找信号是否连接到任何东西
【发布时间】:2011-11-17 11:46:25
【问题描述】:

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

也就是说,我想看看 signals.siSelectionChange 是否连接到任何东西

signals.siSelectionChange.connect( self.SelAsSiAssets )

【问题讨论】:

    标签: python qt pyqt signals slot


    【解决方案1】:

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

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

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

    【讨论】:

    【解决方案2】:

    因为我用 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
    

    【讨论】:

    • 干得好。这里至少有 3 件事不令人满意:1)PyQt5 文档是错误的(没有 fromSignal),2)disconnect 应该在没有连接时抛出 RuntimeError(甚至是 Exception)的想法使得没有意义,3)我不明白为什么这么多QObject 方法(例如isSignalConnected)在它们应该是静态方法时是实例方法:不优雅。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-08
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多