首页 > 解决方案 > 是否有一种基于另一个复选框的状态启用/禁用复选框的优雅方法?

问题描述

我正在组合一个 UI - 用户提供一些信息,然后执行代码。我有一些复选框。我想根据其他复选框的状态启用/禁用某些复选框。例如,我的 UI 有一个复选框让用户指定是否要打印文件,还有一个复选框让用户指定是否希望以彩色打印。如果未选中“打印”复选框,我想清除并禁用“颜色”复选框:如果他们不打印,让某人说他们想要彩色打印是没有任何意义的。

我可以看到如何使用信号/插槽来做到这一点,但我对 Qt 还是很陌生,所以我想知道是否有更清洁的方法来做到这一点。查看 ButtonGroups 是我的第一个停靠点,但我看不到任何让它工作的方法。

我所拥有的看起来像这样。我想强调——这正是我想要它做的——我只是不确定这是不是最好的方法,如果我在几个月后回到代码中,我不想讨厌自己有更多的知识。如果有内置功能可以实现我的目标,我完全不会感到惊讶。

self.first_checkbox = QtWidgets.QCheckBox()
self.second_checkbox = QtWidgets.QCheckBox()

self.first_checkbox.stateChanged.connect(self._handleCheckboxStateChanged)

@QtCore.Slot()
def _handleCheckboxStateChange(self):
    if self.first_checkbox.isChecked():
        self.second_checkbox.setEnabled(True)
    else:
        self.second_checkbox.setEnabled(False)
        self.second_checkbox.setChecked(False)

标签: pythonpyside2

解决方案


您的方法是正确的,我的回答只是尝试显示其他等效方法:

1.

from PySide2 import QtCore, QtWidgets


class Widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)

        self.first_checkbox = QtWidgets.QCheckBox("Print")
        self.second_checkbox = QtWidgets.QCheckBox("color")
        self.first_checkbox.stateChanged.connect(
            lambda state: self.second_checkbox.setDisabled(
                state != QtCore.Qt.Checked
            )
        )
        self.first_checkbox.stateChanged.connect(
            lambda state: self.second_checkbox.setCheckState(
                QtCore.Qt.Unchecked
            )
            if not state
            else None
        )
        self.second_checkbox.setDisabled(True)

        lay = QtWidgets.QVBoxLayout(self)
        lay.addWidget(self.first_checkbox)
        lay.addWidget(self.second_checkbox)


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())

2.

from PySide2 import QtCore, QtWidgets


class Widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)

        self.first_checkbox = QtWidgets.QCheckBox("Print")
        self.second_checkbox = QtWidgets.QCheckBox("color")
        self.first_checkbox.stateChanged.connect(
            self._handleCheckboxStateChange
        )
        self.second_checkbox.setDisabled(True)

        lay = QtWidgets.QVBoxLayout(self)
        lay.addWidget(self.first_checkbox)
        lay.addWidget(self.second_checkbox)

    @QtCore.Slot(QtCore.Qt.CheckState)
    def _handleCheckboxStateChange(self, state):
        self.second_checkbox.setEnabled(state == QtCore.Qt.Checked)
        if state != QtCore.Qt.Checked:
            self.second_checkbox.setCheckState(QtCore.Qt.Unchecked)


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())

推荐阅读