def connect(signal):
def result(func):
signal.connect(func)
return func
return inner
def safemode(msg):
def inner(func):
@wraps(func):
def result(*args, **kwargs):
print 'Args passed to func:', args, kwargs
try:
func(*args, **kwargs)
except:
print msg
return result
return inner
@connect(form.my_action.triggered)
@safemode('Something bad'?)
def my_action():
print 'Something good!'
所以,当我触发该操作时,我看到:
Args passed to func: (False,) {}
Something bad?
由于 my_action
不带任何参数,因此调用 func(*args, **kwargs)
,其中 func
是 my_action
失败。
我知道一种解决方案是删除 *args, **kwargs
但我想对 Qt GUI 函数和非 GUI 函数使用相同的装饰器。
堆栈跟踪不是很有帮助;它只显示 app.exec_()
然后是发生故障的行。
这个 False
从哪里来,我该如何修复它?
最佳答案
有许多常用信号带有传递默认值的参数。这包括 QAction.triggered和 QAbstractButton.clicked .
实际上,就 PyQt 而言,这些信号有两种重载:一种传递默认值,一种不传递默认值。 PyQt 有一种显式选择使用哪个的机制 - 但如果不使用它,它将回退到硬编码的默认值。对于上述两个信号,默认重载是确实传递默认值的信号。
要选择不传递值的重载,请执行以下操作:
form.my_action.triggered[()]
(注意:信号对象的 getitem 语法通常采用类型,或类型的元组,因此需要一个空元组显式选择一个没有参数的重载)。
关于python - Qt 将不需要的参数传递给槽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19713525/