PYQT5 - 插槽函数不采用默认参数 [重复]

Posted

技术标签:

【中文标题】PYQT5 - 插槽函数不采用默认参数 [重复]【英文标题】:PYQT5 - Slot function does not take default argument [duplicate] 【发布时间】:2020-05-16 23:41:21 【问题描述】:

我正在开发一个 PYQT5 接口,其中一个 QPushButton 应该调用一个具有默认参数的槽函数。

self.button = QtWidgets.QPushButton("Button")
self.button.clicked.connect(self.doSomething)

def doSomething(self, boolVariable = True):
  print(boolVariable)

运行 doSomething 函数时的结果:

[in] object_instance.doSomething()
--> True

但是如果我点击按钮,我会得到这个结果:

--> False

谁能解释一下为什么不考虑默认参数?

谢谢!

【问题讨论】:

相关:***.com/questions/59970871/… 【参考方案1】:

QPushButton 的clicked 信号,与任何从 QAbstractButton 继承的类一样,有一个 checked 参数,表示按钮的当前检查(“按下”)状态。

该信号在按钮被激活时发出(即,当鼠标光标在按钮内时按下然后释放)

按钮释放时发出点击信号;此时,按钮未被按下,信号参数将为False

有两种方法可以避免这种情况:

    将信号连接到 lambda:

    self.button.clicked.connect(lambda: self.doSomething())

    在函数中添加一个 pyqtSlot 装饰器,没有签名作为参数:

    @QtCore.pyqtSlot()
    def doSomething(self, boolVariable = True):
        print(boolVariable)

【讨论】:

好的,谢谢。因此,如果我理解正确,checked 参数会静默传递给我的 doSomething() 函数,该函数将其解释为第二个参数(boolVariable)? @Mat4444 确切地说,每个信号参数都被视为位置“可选”参数。这可能看起来很奇怪,因为如果你不向 doSomething 函数添加任何参数,它无论如何都会在没有任何警告的情况下工作,而如果你用一些参数手动调用它,它会抛出超出参数的异常,但 Qt 能够连接到参数少于信号提供的参数的函数,所以如果信号有三个参数并且函数只接受一个位置参数,它无论如何都会工作。

以上是关于PYQT5 - 插槽函数不采用默认参数 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

PYQT5 信号和插槽 [重复]

网址未使用不同类中的信号和插槽 PyQt5 定义

在不丢失默认信号参数的情况下将额外参数传递给 PyQt 插槽

pyqt5:从插槽返回 QObject

vue中的插槽slot理解

函数形参的默认值