【发布时间】:2011-11-17 11:46:25
【问题描述】:
有没有办法判断一个信号是否已经连接到一个函数?
也就是说,我想看看 signals.siSelectionChange 是否连接到任何东西
signals.siSelectionChange.connect( self.SelAsSiAssets )
【问题讨论】:
标签: python qt pyqt signals slot
有没有办法判断一个信号是否已经连接到一个函数?
也就是说,我想看看 signals.siSelectionChange 是否连接到任何东西
signals.siSelectionChange.connect( self.SelAsSiAssets )
【问题讨论】:
标签: python qt pyqt signals slot
您可以使用QObject.receivers 来获取连接函数的计数。我使用它如下,在一个QWidget的closeEvent()中,我用作窗口:
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
【讨论】:
fromSignal),2)disconnect 应该在没有连接时抛出 RuntimeError(甚至是 Exception)的想法使得没有意义,3)我不明白为什么这么多QObject 方法(例如isSignalConnected)在它们应该是静态方法时是实例方法:不优雅。