有没有一种优雅的方法可以根据另一个复选框的状态启用/禁用一个复选框?

时间:2019-06-15 01:36:15

标签: python pyside2

我正在整理一个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)

1 个答案:

答案 0 :(得分:0)

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

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_())