【问题标题】:Ability to disable QCheckbox if two other QCheckboxes are selected如果选择了其他两个 QCheckbox,则能够禁用 QCheckbox
【发布时间】:2019-07-17 14:20:37
【问题描述】:

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

如果选中了 2 个复选框中的任何一个,请禁用最后一个复选框。取消选中复选框后,应重新启用禁用的复选框,依此类推。

“选中了 2 个复选框中的任何一个”是我正在努力解决的部分,因为我不想让一堆 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)

【问题讨论】:

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


    【解决方案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)
    

    【讨论】:

    • 这正是我所需要的!感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多