Python:如何从PyQt中的GroupBox取消分配布局

时间:2014-03-25 00:16:18

标签: python qt pyqt

组合框:

myGroupBox = QtGui.QGroupBox()

和两个布局:

layoutA = QtGui.QVBoxLayout()
layoutB = QtGui.QVBoxLayout()

我将layoutA分配给myGroupBox:

myGroupBox.setLayout(layoutA)

稍后需要将layoutB重新分配给myGroupBox:

myGroupBox.setLayout(layoutB)

但是要警告......

QWidget::setLayout: Attempting to set QLayout "" on QWidget "", which already has a layout

是否可以避免此警告?如何在尝试分配另一个布局之前从myGroupBox中删除布局?

1 个答案:

答案 0 :(得分:2)

要为窗口小部件设置新的顶级布局,您必须删除现有的一个及其所有子项。删除子项非常简单,但删除布局本身必须强制使用sip模块。

这是一个实现:

import sip

def deleteLayout(layout):
    if layout is not None:
        while layout.count():
            item = layout.takeAt(0)
            widget = item.widget()
            if widget is not None:
                widget.deleteLater()
            else:
                deleteLayout(item.layout())
        sip.delete(layout)

如果要保留现有布局及其所有子项,请为窗口小部件提供永久的顶级布局,然后只需切换子布局,如下所示:

    self.widget = QtGui.QWidget(self)
    layout = QtGui.QVBoxLayout(self.widget)
    layout.setContentsMargins(0, 0, 0, 0)
    self.vbox1 = QtGui.QVBoxLayout()
    self.vbox2 = QtGui.QVBoxLayout()
    layout.addLayout(vbox1)
    ...

    self.widget.layout().removeItem(self.vbox1)
    self.widget.layout().addLayout(self.vbox2)