Python 带有lambda信号的PyQt复选框列表

Python 带有lambda信号的PyQt复选框列表,python,lambda,pyqt5,Python,Lambda,Pyqt5,我使用dict键作为复选框文本,从dict创建一些qcheckbox。 然后我使用lambda表达式将信号连接到更新函数。 我想传递给这个更新函数的是复选框的文本,因此每个lambda都有其特定的参数。 尽管如此,无论我点击哪个复选框,我总是会得到最后添加的小部件的文本。 我是否错过了使用lambda进行信号传递的关键概念 import sys from PyQt5.QtWidgets import QDialog, QCheckBox, QVBoxLayout, QApplication, Q

我使用dict键作为复选框文本,从dict创建一些qcheckbox。 然后我使用
lambda
表达式将信号连接到更新函数。 我想传递给这个更新函数的是复选框的文本,因此每个lambda都有其特定的参数。 尽管如此,无论我点击哪个复选框,我总是会得到最后添加的小部件的文本。 我是否错过了使用lambda进行信号传递的关键概念

import sys
from PyQt5.QtWidgets import QDialog, QCheckBox, QVBoxLayout, QApplication, QSlider, QLabel


class Window(QDialog):
    def __init__(self, parent=None):
        super(Window, self).__init__(parent)

        layout = QVBoxLayout()

        cb_dict = {"cb1": False, "cb2": True, "cb3": False}
        cb_widget_list = list()

        for checkbox in cb_dict:
            widget = QCheckBox(checkbox)
            widget.stateChanged.connect(lambda: self.update(checkbox))
            cb_widget_list.append(widget)

        for widget in cb_widget_list:
            layout.addWidget(widget)
        self.setLayout(layout)

    def update(self, origin: str):
        print("Checkbox {} has changed".format(origin))


if __name__ == '__main__':
    app = QApplication(sys.argv)

    main = Window()
    main.show()

    sys.exit(app.exec_())
因此,输出总是
复选框cb3已更改

void QCheckBox::stateChanged(int状态)

每当复选框的状态改变时,即当用户选中或取消选中复选框时,就会发出此信号

状态包含复选框的新Qt::CheckState

由于要传递另一个参数,因此应执行以下操作:

        widget.stateChanged.connect(
            lambda state, checkbox=checkbox: self.update(state, checkbox)  # +++
        )


这很有效,你能快速解释一下原因吗?@pope请参阅更新
import sys
from PyQt5.QtWidgets import QDialog, QCheckBox, QVBoxLayout, QApplication, QSlider, QLabel


class Window(QDialog):
    def __init__(self, parent=None):
        super(Window, self).__init__(parent)

        layout = QVBoxLayout()

        cb_dict = {"cb1": False, "cb2": True, "cb3": False}
        cb_widget_list = list()

        for checkbox in cb_dict:
            widget = QCheckBox(checkbox)
            widget.stateChanged.connect(
                lambda state, checkbox=checkbox: self.update(state, checkbox)  # +++
            )
            cb_widget_list.append(widget)

        for widget in cb_widget_list:
            layout.addWidget(widget)
        self.setLayout(layout)

    def update(self, state, origin: str):                                      # + state
        print("Checkbox {} has changed: {}".format(origin, state))


if __name__ == '__main__':
    app = QApplication(sys.argv)

    main = Window()
    main.show()

    sys.exit(app.exec_())