【问题标题】:Checkbox to uncheck all other checkboxes取消选中所有其他复选框的复选框
【发布时间】:2018-01-23 10:36:04
【问题描述】:

我正在尝试进行一些验证,例如:

  • 选中“选择 A”“选择 B” 时,会自动取消选中 “未选择”
  • 选中“未选择”时,“选择 A”“选择 B” 都会自动取消选中

但是当我运行此代码时,单击任何复选框都会取消选中 所有 3 个复选框。

即窗口初始化时选中了"None Selected"。但是当我点击 "Select A" 时,它会取消选中 "None Selected",这是有意的,但 "Select A" 没有得到检查。

我做错了什么?


import sys
import PyQt5

class Test(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        checkBoxNone = QCheckBox("None Selected")
        checkBoxA    = QCheckBox("Select A")
        checkBoxB    = QCheckBox("Select B")

        checkBoxNone.setChecked(True)
        checkBoxNone.stateChanged.connect(lambda checked: (checkBoxA.setChecked(False), checkBoxB.setChecked(False)))
        checkBoxA.stateChanged.connect(lambda checked: checkBoxNone.setChecked(False))
        checkBoxB.stateChanged.connect(lambda checked: checkBoxNone.setChecked(False))

        grid = QGridLayout()

        grid.addWidget(checkBoxNone, 1, 0)
        grid.addWidget(checkBoxA, 2, 0)
        grid.addWidget(checkBoxB, 3, 0)

        self.setLayout(grid)
        self.setWindowTitle('Test')
        self.show()

if __name__ == '__main__':
    if not QApplication.instance():
        app = QApplication(sys.argv)
    else:
        app = QApplication.instance()
    ex = Test()
    sys.exit(app.exec_())

【问题讨论】:

    标签: python lambda pyqt pyqt5 qcheckbox


    【解决方案1】:

    问题是因为根据您的要求,您应该只在检查了一些QCheckBox但您没有进行验证时才进行这些选项,以便能够正确处理它,创建一个插槽并知道哪个对象信号发出,sender() 方法:

    import sys
    from PyQt5.QtWidgets import *
    from PyQt5.QtCore import *
    
    class Test(QWidget):
        def __init__(self):
            super().__init__()
            self.initUI()
    
        def initUI(self):
            self.checkBoxNone = QCheckBox("None Selected")
            self.checkBoxA    = QCheckBox("Select A")
            self.checkBoxB    = QCheckBox("Select B")
    
            self.checkBoxNone.setChecked(True)
            self.checkBoxNone.stateChanged.connect(self.onStateChange)
            self.checkBoxA.stateChanged.connect(self.onStateChange)
            self.checkBoxB.stateChanged.connect(self.onStateChange)
    
            grid = QGridLayout(self)
    
            grid.addWidget(self.checkBoxNone, 1, 0)
            grid.addWidget(self.checkBoxA, 2, 0)
            grid.addWidget(self.checkBoxB, 3, 0)
            self.setWindowTitle('Test')
            self.show()
    
        @pyqtSlot(int)
        def onStateChange(self, state):
            if state == Qt.Checked:
                if self.sender() == self.checkBoxNone:
                    self.checkBoxA.setChecked(False)
                    self.checkBoxB.setChecked(False)
                elif self.sender() in (self.checkBoxA, self.checkBoxB):
                    self.checkBoxNone.setChecked(False)
    

    【讨论】:

    • 这很好用!太感谢了。我实际上花了几个小时在谷歌上搜索解决方案,但我访问过的几十个页面(其中许多是 StackOverflow)都没有解决这个特殊问题。
    猜你喜欢
    • 2013-01-25
    • 1970-01-01
    • 1970-01-01
    • 2014-04-29
    • 1970-01-01
    • 1970-01-01
    • 2013-06-24
    • 1970-01-01
    • 2016-01-29
    相关资源
    最近更新 更多