当选中其他复选框时将复选框状态更改为不选中pyqt

问题描述 投票:0回答:3

我正在使用 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 pyqt qt-designer signals-slots qcheckbox
3个回答
15
投票

最简单的方法是使用两个信号连接,其中之一可以在 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))

只使用信号。您说不能直接通过设计器执行此操作是正确的,因为您必须反转已检查的属性。我想到的最简单、最易读的方法是使用一个公共槽加上一个内部成员变量来保存两者的检查状态:

5
投票

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)

    
    

    添加插槽:
  • @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)

1
投票
如果您希望 checkbox_1 选中或取消选中许多其他复选框(例如全选),那么您可以使用另一个函数来调用其他函数来选中/取消选中复选框,而不是 checkbox_1 直接调用上述函数,如下所示:

def Select_ALL_checkboxes(self): self.Change_the_Checkbox_1_Function() self.Change_the_Checkbox_2_Function() self.Change_the_Checkbox_3_Function() ....etc

对我来说,这是最合乎逻辑的方式,而且不会太技术化。它运行良好且速度快。可能不是最有效或最漂亮的,但我发现这是一次选中/取消选中多个复选框的最佳方法。


© www.soinside.com 2019 - 2024. All rights reserved.