Python PyQt-取消选中所有其他复选框的复选框 [英] Python PyQt - Checkbox to uncheck all other checkboxes

查看:399
本文介绍了Python PyQt-取消选中所有其他复选框的复选框的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试进行以下验证:

I'm trying to put in some validation such that:

  • 选中选择A" 选择B" 时,会自动取消选中未选择"
  • 选中未选中"后,选择A" 选择B" 都将自动取消选中
  • When either "Select A" or "Select B" is checked, "None Selected" is automatically unchecked
  • When "None Selected" is checked, both "Select A" and "Select B" are automatically unchecked

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

But when I run this code, clicking any checkbox will uncheck all the 3 checkboxes.

即初始化未选择" 窗口会初始化.但是,当我单击选择A" 时,它取消了未选择" 的选择,这是有意的,但是选择A" 却没有得到已选中.

i.e. The window initializes with "None Selected" checked. But when I click "Select A", it unchecks "None Selected", which is intended, but "Select A" doesn't get checked.

我在做什么错了?

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

推荐答案

引起此问题的原因是,根据您的要求,只有在选中了某些QCheckBox的情况下,才应选择那些选项,但您不进行此验证.能够正确处理它,创建一个插槽并知道发出信号的对象,sender()方法:

The problem is caused because according to your requirements, you should only make those options if some QCheckBox is checked but you do not do that verification, to be able to handle it properly, create a slot and to know which object the signal was emited, the sender() method:

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)

这篇关于Python PyQt-取消选中所有其他复选框的复选框的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆