与 QPushButton 一起使用时,错误 lambda 缺少 1 个必需的位置参数

Posted

技术标签:

【中文标题】与 QPushButton 一起使用时,错误 lambda 缺少 1 个必需的位置参数【英文标题】:Error lambda missing 1 required positional argument when using with QPushButton 【发布时间】:2020-12-07 15:55:13 【问题描述】:

这是我的全部代码:

import sys

from PySide2.QtCore import Qt
from PySide2.QtWidgets import (
    QApplication,
    QHBoxLayout,
    QLabel,
    QMainWindow,
    QPushButton,
    QVBoxLayout,
    QWidget,
)

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        v = QVBoxLayout()
        h = QHBoxLayout()

        for a in range(10):
            button = QPushButton(str(a))
            button.clicked.connect(lambda checked, a=a: self.button_clicked(a)) # error here

            h.addWidget(button)

        v.addLayout(h)

        self.label = QLabel("")
        v.addWidget(self.label)
        
        w = QWidget()
        w.setLayout(v)

        self.setCentralWidget(w)

    def button_clicked(self, n):
        self.label.setText(str(n))

app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()

当我运行这段代码时,我得到一个像这样的窗口:

在按钮下方,有一个 QLabel,我希望当我单击任何按钮时,按钮的标签将引用此 QLabel,但我在终端中遇到了一堆令人困惑的错误。我的代码有什么问题,请帮助我,谢谢。

【问题讨论】:

【参考方案1】:

clicked 信号过载,因此它接受 2 个签名,可以发送或不发送布尔值。默认签名取决于库,在这种情况下,PySide2 似乎默认不发送“checked”参数,这与 PyQt5 不同。

解决办法是注明签名:

button.clicked<b>[bool]</b>.connect(lambda checked, a=a: self.button_clicked(a))

【讨论】:

以上是关于与 QPushButton 一起使用时,错误 lambda 缺少 1 个必需的位置参数的主要内容,如果未能解决你的问题,请参考以下文章

c++ 程序 (.cpp) 如何与 header(.h) 和 libtool (.la) 一起工作?

使 QMenu 具有与父级相同的宽度(QPushButton)

QT5下的QPushButton错误,同时在macos上推送到全屏

OSX QPushButton 文本对齐

当我在 QPushbutton 的位置发送或发布 QMouseEvent 时,不会发出其 clicked() 信号

为啥使用与父级一起声明的 std::function 在与子级一起使用时会显示错误?