一般的なシングル ショット スロット ラッパーをコーディングしようとしています。これが私が今持っているものです:
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)
問題は、マークされたコードが正しく機能しているときに 1 つの引数で(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()
汎用的で、あらゆる種類の信号とスロットで使用できるようにしたいからです。