Python PyQt复选框取消选中所有其他复选框

2024-05-29 04:49:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试进行一些验证,以便:

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

但当我运行这段代码时,单击任何复选框将取消选中全部这3个复选框。在

即,窗口初始化时选中“无选择”。但是当我点击选择一个“”时,它会取消选中“无选择”,这是有意的,但是“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_())

Tags: lambdatestselffalseconnectsysselectgrid
1条回答
网友
1楼 · 发布于 2024-05-29 04:49:04

问题的产生是因为根据您的要求,您应该只在某些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)

相关问题 更多 >

    热门问题