Qt将不需要的参数传递给插槽

时间:2013-10-31 17:57:40

标签: python qt pyqt signals-slots

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) funcmy_action的{​​{1}}失败。

我知道一个解决方案就是删除*args, **kwargs,但我想为Qt GUI函数和非GUI函数使用相同的装饰器。

堆栈跟踪不是很有帮助;它只显示app.exec_()然后显示发生故障的行。

False来自哪里,我该如何解决?

1 个答案:

答案 0 :(得分:2)

有许多常用信号,其参数通过默认值。其中包括QAction.triggeredQAbstractButton.clicked

实际上,就PyQt而言,这些信号有两个重载:一个传递默认值,另一个不传递默认值。 PyQt有一种显式选择使用哪种机制的机制 - 但如果不使用它,它将回退到硬编码的默认值。对于上述两个信号,默认重载是 传递默认值的那个。

要选择传递值的重载,请执行以下操作:

form.my_action.triggered[()]

(注意:信号对象的 getitem 语法通常采用类型类型的元组,因此需要一个空元组显式选择没有参数的重载。)