我正在使用 Qt Designer 和 pyqt 代码来编写应用程序。
我有一个非常简单的问题:在我的用户界面中,我有 2 个复选框,我需要的是当第二个复选框为 unchecked 时,将第一个复选框设置为 unchecked。
换句话说,只有当第二个复选框被选中时,第一个复选框才能被选中,但是如果第一个复选框没有被选中,第二个复选框也可以被选中。
在 Qt Designer 中,我还没有找到一种easy的方法来使用信号/槽函数来做到这一点。
我查看了 Qt API,并尝试编写一些代码:
class CreateRIVLayerDialog(QDialog, FORM_CLASS):
def __init__(self, iface)
# some more code here...
if self.addCheckDB.isChecked():
self.addCheck.setChecked(False)
但没有结果。
有人有一些提示吗?
谢谢
最简单的方法是使用两个信号连接,其中之一可以在 Qt Designer 中完成。
你的设计要求“只有当第二个复选框被选中时,第一个复选框才能被选中”。这相当于说当第二个复选框为“未选中”时,第一个复选框应为“禁用”。禁用该复选框可以让用户清楚该选项不可用。
因此,在 Qt Designer 中,您应该将 toggled
的
checkbox2
信号连接到
setEnabled
的 checkbox1
插槽。 (可能还需要在 Qt Designer 中设置 enabled
的初始 checkbox1
状态)。然后,在您的代码中,您应该建立第二个连接,如下所示:
self.checkbox2.toggled.connect(
lambda checked: not checked and self.checkbox1.setChecked(False))
每当
checkbox1
未选中时,这将清除
checkbox2
的选中状态。
如果你想用代码完成整个事情,它看起来像这样:
self.checkbox1.setEnabled(False)
self.checkbox2.toggled.connect(self.checkbox1.setEnabled)
self.checkbox2.toggled.connect(
lambda checked: not checked and self.checkbox1.setChecked(False))
只使用信号。您说不能直接通过设计器执行此操作是正确的,因为您必须反转已检查的属性。我想到的最简单、最易读的方法是使用一个公共槽加上一个内部成员变量来保存两者的检查状态:
将
self._toggle = INITIAL_VALUE
self._toggle = True
self.check1 = QCheckBox('Check 1', self)
self.check1.setChecked(self._toggle)
self.check2 = QCheckBox('Check 2', self)
self.check2.setChecked(not self._toggle)
添加插槽:
@pyqtSlot()
def toggle(self):
self._toggle = not self._toggle
self.check1.setChecked(self._toggle)
self.check2.setChecked(not self._toggle)
将两个复选框的
clicked
警告!不要在此处使用
stateChanged
信号,否则您将开始无限递归。 :3
self.check1.clicked.connect(self.toggle)
self.check2.clicked.connect(self.toggle)
self._toggle
值和第二个复选框的 self._toggle
如果您希望减少插槽内的反转,以下也可以工作,尽管它的可读性较差:
@pyqtSlot()
def toggle(self):
self.check2.setChecked(self._toggle) # Old value of our check1 becomes the value of check2
self._toggle = not self._toggle # Invert
self.check1.setChecked(self._toggle) # New value is assigned to check1
注意:
您还可以在插槽内使用isChecked()
并在没有额外变量的情况下执行上述所有操作,但是我发现这更具可读性并且函数调用要少得多(每个 isChecked()
和 setChecked()
都是函数调用)
我知道我参加这个聚会迟到了,但有一种方法可以更轻松地完成此任务,我想原来的人想要的。干得好。如果您有一个 checkbox_1 并且选中/取消选中它,它将连接到以下函数。
def Change_the_Checkbox_Function(self):
if self.checkbox_1.isChecked():
if self.checkbox_2.isChecked():
pass
else:
self.checkbox_2.setChecked(True)
else:
self.checkbox_2.setChecked(False)
def Select_ALL_checkboxes(self):
self.Change_the_Checkbox_1_Function()
self.Change_the_Checkbox_2_Function()
self.Change_the_Checkbox_3_Function()
....etc
对我来说,这是最合乎逻辑的方式,而且不会太技术化。它运行良好且速度快。可能不是最有效或最漂亮的,但我发现这是一次选中/取消选中多个复选框的最佳方法。