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

标签 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 失败。

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

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

这个 False 从哪里来,我该如何修复它?

最佳答案

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

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

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

form.my_action.triggered[()]

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

关于python - Qt 将不需要的参数传递给槽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19713525/

相关文章:

python - 字典键上的正则表达式匹配

python - strace输出处理

qt - Qt、MinGW、CMake 配置错误 : Qt version not found

python - 如何子类化 QMessageBox 并在 PySide 中添加进度条

python - 用于在屏幕上定位窗口的类

python - 如何使用 Keras 构建多类卷积神经网络

python - pandas - 获取每个多索引级别标签行的一小部分

c++ - 命名空间 'u16string' 中没有名为 'std' 的类型

python - 在图形 View 上绘制在错误位置的小部件之间的线

qt - PyQt绘制垂直标签