如果选择了另外两个 QCheckbox,则能够禁用 QCheckbox
Ability to disable QCheckbox if two other QCheckboxes are selected
我在 Designer 中使用 PyQt5 创建了 3 个复选框。我想要这样的逻辑流程:
如果选中了 2 个复选框中的任何一个,请禁用最后一个剩余的复选框。取消选中复选框后,应重新启用禁用的复选框等。
"any of the 2 checkboxes are checked" 是我正在努力解决的部分,因为我不想让一堆 if 语句创建这个逻辑。
到目前为止,这是我的代码:
class MyApp(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
QtWidgets.QMainWindow.__init__(self)
Ui_MainWindow.__init__(self)
self.setFixedSize(250, 330)
self.setupUi(self)
self.sewage.stateChanged.connect(self.onStateChange)
self.water.stateChanged.connect(self.onStateChange)
self.internet.stateChanged.connect(self.onStateChange)
@pyqtSlot(int)
def onStateChange(self, state):
if state == Qt.Checked:
if self.sender() == self.sewage or self.sender() == self.internet:
self.water.setEnabled(False)
elif self.sender() == self.internet or self.sender() == self.water:
self.sewage.setEnabled(False)
elif self.sender() == self.water or self.sender() == self.sewage:
self.internet.setEnabled(False)
else:
self.water.setEnabled(True)
self.internet.setEnabled(True)
self.sewage.setEnabled(True)
一种方案是反算,即未勾选的按钮个数为1则是否禁用:
class MyApp(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
QtWidgets.QMainWindow.__init__(self)
self.setFixedSize(250, 330)
self.setupUi(self)
self.sewage.stateChanged.connect(self.onStateChange)
self.water.stateChanged.connect(self.onStateChange)
self.internet.stateChanged.connect(self.onStateChange)
@pyqtSlot()
def onStateChange(self):
buttons = [self.water, self.sewage, self.internet]
uncheckeds = [btn for btn in buttons if not btn.isChecked()]
for btn in uncheckeds:
btn.setDisabled(len(uncheckeds) == 1)
可以用 QButtonGroup 完成相同的逻辑:
class MyApp(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
QtWidgets.QMainWindow.__init__(self)
self.setFixedSize(250, 330)
self.setupUi(self)
self.m_group = QtWidgets.QButtonGroup(
self, exclusive=False, buttonClicked=self.onButtonClicked
)
for btn in (self.sewage, self.water, self.internet):
self.m_group.addButton(btn)
@QtCore.pyqtSlot()
def onButtonClicked(self):
uncheckeds = [
btn for btn in self.m_group.buttons() if not btn.isChecked()
]
for btn in uncheckeds:
btn.setDisabled(len(uncheckeds) == 1)
我在 Designer 中使用 PyQt5 创建了 3 个复选框。我想要这样的逻辑流程:
如果选中了 2 个复选框中的任何一个,请禁用最后一个剩余的复选框。取消选中复选框后,应重新启用禁用的复选框等。
"any of the 2 checkboxes are checked" 是我正在努力解决的部分,因为我不想让一堆 if 语句创建这个逻辑。
到目前为止,这是我的代码:
class MyApp(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
QtWidgets.QMainWindow.__init__(self)
Ui_MainWindow.__init__(self)
self.setFixedSize(250, 330)
self.setupUi(self)
self.sewage.stateChanged.connect(self.onStateChange)
self.water.stateChanged.connect(self.onStateChange)
self.internet.stateChanged.connect(self.onStateChange)
@pyqtSlot(int)
def onStateChange(self, state):
if state == Qt.Checked:
if self.sender() == self.sewage or self.sender() == self.internet:
self.water.setEnabled(False)
elif self.sender() == self.internet or self.sender() == self.water:
self.sewage.setEnabled(False)
elif self.sender() == self.water or self.sender() == self.sewage:
self.internet.setEnabled(False)
else:
self.water.setEnabled(True)
self.internet.setEnabled(True)
self.sewage.setEnabled(True)
一种方案是反算,即未勾选的按钮个数为1则是否禁用:
class MyApp(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
QtWidgets.QMainWindow.__init__(self)
self.setFixedSize(250, 330)
self.setupUi(self)
self.sewage.stateChanged.connect(self.onStateChange)
self.water.stateChanged.connect(self.onStateChange)
self.internet.stateChanged.connect(self.onStateChange)
@pyqtSlot()
def onStateChange(self):
buttons = [self.water, self.sewage, self.internet]
uncheckeds = [btn for btn in buttons if not btn.isChecked()]
for btn in uncheckeds:
btn.setDisabled(len(uncheckeds) == 1)
可以用 QButtonGroup 完成相同的逻辑:
class MyApp(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
QtWidgets.QMainWindow.__init__(self)
self.setFixedSize(250, 330)
self.setupUi(self)
self.m_group = QtWidgets.QButtonGroup(
self, exclusive=False, buttonClicked=self.onButtonClicked
)
for btn in (self.sewage, self.water, self.internet):
self.m_group.addButton(btn)
@QtCore.pyqtSlot()
def onButtonClicked(self):
uncheckeds = [
btn for btn in self.m_group.buttons() if not btn.isChecked()
]
for btn in uncheckeds:
btn.setDisabled(len(uncheckeds) == 1)