1
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)where funcismy_action失败。

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

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

这是False从哪里来的,我该如何解决?

4

1 回答 1

2

有许多常用的信号带有传递默认值的参数。这包括QAction.triggeredQAbstractButton.clicked

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

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

form.my_action.triggered[()]

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

于 2013-10-31T18:53:06.053 回答