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



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

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

阿拉伯数字。

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

最新更新