Есть ли элегантный способ включить / отключить флажок на основе состояния другого флажка? - PullRequest
0 голосов
/ 15 июня 2019

Я собираю пользовательский интерфейс - пользователи предоставляют некоторую информацию, и код выполняется. У меня есть несколько флажков. Я хочу включить / отключить некоторые флажки в зависимости от состояния других флажков. Например, в моем пользовательском интерфейсе есть флажок, который позволяет пользователю указать, хочет ли он, чтобы файл печатался, и флажок, который позволяет пользователю указать, хочет ли он печатать в цвете. Если флажок «печать» не отмечен, я хочу снять и отключить флажок «цвет»: нет смысла позволять кому-то говорить, что он хочет печатать в цвете, если он не печатает.

Я вижу, как это сделать с помощью сигналов / слотов, но я довольно новичок в 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 голосов
/ 15 июня 2019

Ваш метод правильный, мой ответ просто пытается показать другие эквивалентные методы:

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