如果选择了其他两个QCheckbox,则能够禁用QCheckbox

时间:2019-07-17 14:20:37

标签: python python-3.x pyqt pyqt5 qcheckbox

我有3个使用PyQt5在Designer中创建的复选框。我想要这样的逻辑流程:

如果选中两个复选框中的任何一个,则禁用最后剩余的复选框。取消选中复选框后,应该重新启用禁用的复选框,依此类推。

“两个复选框中的任何一个都被选中”是我苦苦挣扎的部分,因为我不想让大量的if语句创建这种逻辑。

到目前为止,这是我的代码:

class MyApp(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        QtWidgets.QMainWindow.__init__(self)
        Ui_MainWindow.__init__(self)
        self.setFixedSize(250, 330)
        self.setupUi(self)

        self.sewage.stateChanged.connect(self.onStateChange)
        self.water.stateChanged.connect(self.onStateChange)
        self.internet.stateChanged.connect(self.onStateChange)

    @pyqtSlot(int)
    def onStateChange(self, state):
        if state == Qt.Checked:
            if self.sender() == self.sewage or self.sender() == self.internet:
                self.water.setEnabled(False)
            elif self.sender() == self.internet or self.sender() == self.water:
                self.sewage.setEnabled(False)
            elif self.sender() == self.water or self.sender() == self.sewage:
                self.internet.setEnabled(False)
        else:
            self.water.setEnabled(True)
            self.internet.setEnabled(True)
            self.sewage.setEnabled(True)

1 个答案:

答案 0 :(得分:1)

一种解决方案是计算相反的值,即,如果未选中的按钮的数量为1,然后将其禁用或禁用:

class MyApp(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        QtWidgets.QMainWindow.__init__(self)
        self.setFixedSize(250, 330)
        self.setupUi(self)

        self.sewage.stateChanged.connect(self.onStateChange)
        self.water.stateChanged.connect(self.onStateChange)
        self.internet.stateChanged.connect(self.onStateChange)

    @pyqtSlot()
    def onStateChange(self):
        buttons = [self.water, self.sewage, self.internet]
        uncheckeds = [btn for btn in buttons if not btn.isChecked()]
        for btn in uncheckeds:
            btn.setDisabled(len(uncheckeds) == 1)

使用QButtonGroup可以完成相同的逻辑:

class MyApp(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        QtWidgets.QMainWindow.__init__(self)
        self.setFixedSize(250, 330)
        self.setupUi(self)

        self.m_group = QtWidgets.QButtonGroup(
            self, exclusive=False, buttonClicked=self.onButtonClicked
        )
        for btn in (self.sewage, self.water, self.internet):
            self.m_group.addButton(btn)

    @QtCore.pyqtSlot()
    def onButtonClicked(self):
        uncheckeds = [
            btn for btn in self.m_group.buttons() if not btn.isChecked()
        ]
        for btn in uncheckeds:
            btn.setDisabled(len(uncheckeds) == 1)