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

时间:2016-03-29 10:01:21

标签: qt checkbox pyqt

我使用Qt Designer和pyqt代码编写应用程序。

我有一个非常简单的问题:在我的界面中我有2个复选框,我需要的是在第二个复选框取消选中时将第一个复选框设置为始终取消选中

换句话说,只有在选中第二个复选框时才能检查第一个复选框,但如果未选中第一个复选框,则也可以检查第二个复选框。

在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)

但没有结果。

有人有提示吗?

由于

3 个答案:

答案 0 :(得分:4)

只需使用信号。当你说你不能通过设计师直接这样做时,你是正确的,因为你必须反转被检查的属性。我想到的最简单,最易读的方法是使用一个公共插槽加一个内部成员变量来保存两者的选中状态:

  • 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(),并且在没有额外变量的情况下执行上述所有操作,但是我发现它更具可读性且函数调用更少(每{{ 1}}和isChecked()是函数调用)

答案 1 :(得分:3)

最简单的方法是使用两个信号连接,其中一个可以在Qt Designer中完成。

您的设计要求“只有在选中第二个复选框时才能检查第一个复选框”。这相当于当第二个复选框取消选中时,第一个复选框应禁用。禁用该复选框可以使用户清楚该选项不可用。

因此,在Qt Designer中,您应该将toggled的{​​{1}}信号连接到checkbox2的{​​{1}}广告位。 (也可能需要在Qt Designer中设置setEnabled的初始checkbox1状态。

然后,在您的代码中,您应该建立第二个连接,如下所示:

enabled

每当checkbox1取消选中时,这将清除 self.checkbox2.toggled.connect( lambda checked: not checked and self.checkbox1.setChecked(False)) 的已检查状态。

如果你想在代码中完成所有事情,它将如下所示:

checkbox1

答案 2 :(得分:0)

我知道我参加这个派对已经很晚了,但是有一种方法可以更轻松地实现这一目标,我想原来的人想要的是什么。干得好。如果您有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)

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

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

    ....etc

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