【问题标题】:Qt passes an unwanted argument to a slotQt 将不需要的参数传递给插槽
【发布时间】:2013-11-11 20:56:25
【问题描述】:
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)会失败。

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

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

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

【问题讨论】:

标签: python qt pyqt signals-slots


【解决方案1】:

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

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

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

form.my_action.triggered[()]

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

【讨论】:

    猜你喜欢
    • 2022-01-10
    • 2011-05-08
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 2020-03-12
    • 2016-09-05
    • 2012-01-08
    • 1970-01-01
    相关资源
    最近更新 更多