首页 > 解决方案 > QCheckbox 检查所有其他 QCheckBoxes

问题描述

我的问题与这篇文章Python PyQt - Checkbox to uncheck all other checkboxes非常相似。However, I am trying to check all other boxes when main checkbox is selected and at the same time, if any of the other boxes are selected independently, then I would like to deselect the main checkbox. 我尝试修改提供的答案,但无法将头放在“self.sender”信号上。当我取消选择复选框时,我无法更改选择。这是我使用@eyllanesc提供的解决方案修改的代码。非常感谢任何帮助,谢谢!

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *

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

    def initUI(self):
       self.checkBoxAll = QCheckBox("Select All")
       self.checkBoxA    = QCheckBox("Select A")
       self.checkBoxB    = QCheckBox("Select B")

        self.checkBoxAll.setChecked(False)
        self.checkBoxAll.stateChanged.connect(self.onStateChange)
        self.checkBoxA.stateChanged.connect(self.onStateChange)
        self.checkBoxB.stateChanged.connect(self.onStateChange)

        grid = QGridLayout(self)

        grid.addWidget(self.checkBoxAll, 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.checkBoxAll:
                self.checkBoxA.setChecked(True)
                self.checkBoxB.setChecked(True)
            elif self.sender() in (self.checkBoxA, self.checkBoxB):
                self.checkBoxAll.setChecked(False)

标签: pythonpython-3.xpyqtpyqt5qcheckbox

解决方案


使用您所拥有的逻辑,您正在创建一个循环,因为任何元素的状态更改以更改另一个元素的状态,其想法是在使用blockSignals()在插槽中实现状态更改时阻止信号的发射:

from PyQt5 import QtCore, QtGui, QtWidgets

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

    def initUI(self):
       self.checkBoxAll = QtWidgets.QCheckBox("Select All")
       self.checkBoxAll.setChecked(False)
       self.checkBoxAll.stateChanged.connect(self.onStateChangePrincipal)

       self.checkBoxA   = QtWidgets.QCheckBox("Select A")
       self.checkBoxB   = QtWidgets.QCheckBox("Select B")
       self.checkboxes = [self.checkBoxA, self.checkBoxB]

       for checkbox in self.checkboxes:
            checkbox.stateChanged.connect(self.onStateChange)

       grid = QtWidgets.QGridLayout(self)
       grid.addWidget(self.checkBoxAll, 1, 0)
       grid.addWidget(self.checkBoxA, 2, 0)
       grid.addWidget(self.checkBoxB, 3, 0)
       self.setWindowTitle('Test')

    @QtCore.pyqtSlot(int)
    def onStateChangePrincipal(self, state):
        if state == QtCore.Qt.Checked:
            for checkbox in self.checkboxes:
                checkbox.blockSignals(True)
                checkbox.setCheckState(state)
                checkbox.blockSignals(False)

    @QtCore.pyqtSlot(int)
    def onStateChange(self, state):
        self.checkBoxAll.blockSignals(True)
        self.checkBoxAll.setChecked(QtCore.Qt.Unchecked)
        self.checkBoxAll.blockSignals(False)

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = Test()
    w.show()
    sys.exit(app.exec_())

推荐阅读