我正在尝试编写通用单发插槽包装器。这是我现在拥有的:
def single_shot_connect(signal, slot):
signaled = [False]
def single_shot_slot(*args, **kwargs):
if signaled[0]: return
signaled[0] = True
signal.disconnect(single_shot_slot)
slot(*args, **kwargs)
signal.connect(single_shot_slot)
def foo(): pass
class Bar(QtCore.QObject): sig = QtCore.Signal([int])
bar1 = Bar()
bar1.sig.connect(foo)
bar1.sig.emit(1) # (1)
bar2 = Bar()
single_shot_connect(bar2.sig, foo)
bar2.sig.emit(1) # (2)
问题是标记(2)
的代码不起作用,因为它在正常工作时尝试foo()
使用一个参数进行调用(1)
。
我怎样才能single_shot_connect()
工作?
编辑: single_shot_connect()
可以针对这种特殊情况进行修复,如下所示:
def single_shot_connect(signal, slot):
signaled = [False]
def single_shot_slot(): # Note absence of *args, **kwargs
if signaled[0]: return
signaled[0] = True
signal.disconnect(single_shot_slot)
slot() # Note absence of *args, **kwargs
signal.connect(single_shot_slot)
但这对我来说并不有趣,因为我想要single_shot_connect()
通用且可用于任何类型的信号和插槽。