【问题标题】:PyQt Checkbox List with lambda signal [duplicate]带有 lambda 信号的 PyQt 复选框列表
【发布时间】:2019-11-21 11:17:19
【问题描述】:

我使用字典键作为复选框文本从字典创建了一些 QCheckBoxes。 然后我使用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_())

所以输出总是Checkbox cb3 has changed

【问题讨论】:

    标签: python lambda pyqt5


    【解决方案1】:

    void QCheckBox::stateChanged(int state)

    只要复选框的状态发生变化,即用户选中或取消选中它,就会发出此信号。

    state 包含复选框的新 Qt::CheckState。

    既然你想传递另一个参数,你应该这样做:

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

    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_())
    

    【讨论】:

    • 那行得通,你能快速解释一下原因吗?
    • @pope 查看更新
    猜你喜欢
    • 2016-02-04
    • 1970-01-01
    • 2015-10-07
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 2018-06-01
    • 1970-01-01
    • 2013-07-18
    相关资源
    最近更新 更多