python - 是否有一种基于另一个复选框的状态启用/禁用复选框的优雅方法?
问题描述
我正在组合一个 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_())
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_())
推荐阅读
- python - 将 qpushbutton 连接到 lambda
- angular - 根据条件停止出现 Mat 对话框
- gcc - 在 gcc/clang 的帮助下生成 cpp 类型
- laravel - 有没有办法用 Laravel 创建组织 CRUD 树(OrgChart)
- javascript - 返回函数时的Javascript内存使用情况
- c# - 当我从 C# App 向 Laravel 发送 post 请求时,为什么 $request 为空?
- php - 如何通过表单通过 POST 传递 TD id
- delphi - 帕斯卡中的素数计算
- contains - 包含无法找到 VbTab 和 Chr
- python - 如何将 Python 字节对象直接存储到 MySql 数据库中而无需使用额外的字节?