Python PyQt - Флажок, чтобы проверить все остальные флажки - PullRequest
0 голосов
/ 03 января 2019

Мой вопрос очень похож на этот пост, Python PyQt - флажок, чтобы снять все остальные флажки .Тем не менее, я пытаюсь установить все остальные флажки, когда установлен основной флажок, и в то же время, если любой из других флажков выбран независимо, то я бы хотел снять флажок основного.Я попытался изменить предоставленный ответ, но не смог сосредоточиться на сигнале «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)

1 Ответ

0 голосов
/ 03 января 2019

С логикой, которую вы используете, вы создаете цикл с момента изменения состояния любого элемента, чтобы изменить состояние другого элемента, идея состоит в том, чтобы блокировать излучение сигналов, когда изменение состояния реализуется в слоте с помощью 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_())
...