gpt4 book ai didi

python - 如何制作通用的 PySide 单发插槽

转载 作者:太空宇宙 更新时间:2023-11-04 01:30:23 24 4
gpt4 key购买 nike

我正在尝试编写通用的单次插槽包装器代码。这是我现在拥有的:

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()用一个参数 while (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()通用并可用于任何类型的信号和槽。

最佳答案

自 Qt guarantees插槽调用的顺序将是 connect 语句的顺序,您可以简单地这样做:

def single_shot_connect(signal, slot):
def disconnect(*args, **kwargs):
signal.disconnect(slot)
signal.disconnect(disconnect)
signal.connect(slot)
signal.connect(disconnect)

signal发出后,slot会被调用。紧随其后的是 disconnect 调用,它会删除 slot 及其自身。因此它们不会被调用以进行后续发射。

完整用法示例:

import sys
from PySide import QtCore

class Foo(QtCore.QObject):
sig = QtCore.Signal(int)

def bar():
print 'running bar'


def single_shot_connect(signal, slot):
def disconnect(*args, **kwargs):
signal.disconnect(slot)
signal.disconnect(disconnect)
signal.connect(slot)
signal.connect(disconnect)



if __name__ == '__main__':
app = QtCore.QCoreApplication(sys.argv)

foo = Foo()
single_shot_connect(foo.sig, bar)

foo.sig.emit(1)
foo.sig.emit(2)

QtCore.QTimer.singleShot(1000, app.exit)

sys.exit(app.exec_())

关于python - 如何制作通用的 PySide 单发插槽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14235036/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com