0

我有一个 GroupBox,里面有 6 个复选框。我希望在检查 GroupBox 时检查它们,并在取消选中 GroupBox 时取消选中它们,就像切换所有它们一样。

就像是:

for box in self.GroupBox.findChildren(QtGui.QCheckBox):
    if self.GroupBox.isChecked()==True:
        box.setChecked ==True
    else:
        pixel_box.setChecked == False

我怎样才能做到这一点?

4

1 回答 1

1

每次更改都必须进行这些QGroupBox更改,因此它提供了切换信号,因此将连接一个插槽并进行更改。

根据文档

可检查:布尔

该属性保存分组框的标题中是否有复选框

如果此属性为真,则组框使用复选框代替普通标签显示其标题。如果选中该复选框,则启用组框的子项;否则,它们将被禁用且无法访问。

从上面观察到孩子被禁用,这是一个意外的情况,但我们是启用它。

综上所述,应做到以下几点:

    self.GroupBox.toggled.connect(self.onToggled)
    self.GroupBox.setCheckable(True)

def onToggled(self, on):
    for box in self.sender().findChildren(QtGui.QCheckBox):
        box.setChecked(on)
        box.setEnabled(True)

实现上述内容的示例如下:

class Widget(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.setLayout(QtGui.QVBoxLayout())
        self.GroupBox = QtGui.QGroupBox(self)

        self.GroupBox.setLayout(QtGui.QVBoxLayout())
        for i in range(6):
            checkbox = QtGui.QCheckBox("{}".format(i), self.GroupBox)
            self.GroupBox.layout().addWidget(checkbox)

        self.layout().addWidget(self.GroupBox)
        self.GroupBox.toggled.connect(self.onToggled)
        self.GroupBox.setCheckable(True)

    def onToggled(self, on):
        for box in self.sender().findChildren(QtGui.QCheckBox):
            box.setChecked(on)
            box.setEnabled(True)


if __name__ == '__main__':
    import sys

    app = QtGui.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())
于 2017-09-18T13:31:33.170 回答