我正在使用Qt Designer和pyqt代码编写应用程序。
我有一个非常简单的问题:在我的UI中,我有2个复选框,而我需要将第一个复选框设置为在未选中第二个复选框时始终保持未选中状态。
换句话说,只有在选中第二个复选框时才可以选中第一个复选框,但是如果未选中第一个复选框,则也可以选中第二个复选框。
在Qt Designer中,我找不到使用Signals / Slots函数执行此操作的简便方法。
我查看了Qt API,并尝试编写一些代码:
class CreateRIVLayerDialog(QDialog, FORM_CLASS):
def __init__(self, iface)
# some more code here...
if self.addCheckDB.isChecked():
self.addCheck.setChecked(False)
Run Code Online (Sandbox Code Playgroud)
但没有结果。
有人有提示吗?
谢谢
只是使用信号。您说不能直接通过设计器执行此操作是正确的,因为您必须反转选中的属性。我想到的最简单,最易读的方式是使用一个通用插槽以及一个内部成员变量,该变量保存两个状态的检查状态:
添加self._toggle = INITIAL_VALUE到您的课程中-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)
Run Code Online (Sandbox Code Playgroud)添加广告位:
@pyqtSlot()
def toggle(self):
self._toggle = not self._toggle
self.check1.setChecked(self._toggle)
self.check2.setChecked(not self._toggle)
Run Code Online (Sandbox Code Playgroud)将clicked两个复选框的信号连接到该插槽。
警告!千万不能使用stateChanged此信号,否则将启动一个无限递归。:3
self.check1.clicked.connect(self.toggle)
self.check2.clicked.connect(self.toggle)
Run Code Online (Sandbox Code Playgroud)我在这里所做的基本上是接管两个复选框的状态更改,并使用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
Run Code Online (Sandbox Code Playgroud)
注意:您还可以使用isChecked()的插槽内,做上述所有没有额外的变量,但是我觉得这更容易阅读和少得多的函数调用(每isChecked()和setChecked()一个函数调用)
最简单的方法是使用两个信号连接,其中一个可以在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))
Run Code Online (Sandbox Code Playgroud)
这将清除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))
Run Code Online (Sandbox Code Playgroud)