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

2 投票
1 回答
1935 浏览
提问于 2025-04-17 23:44

一个组框:

myGroupBox = QtGui.QGroupBox()

还有两个布局:

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

我把布局A分配给我的组框:

myGroupBox.setLayout(layoutA)

后来需要把布局B重新分配给我的组框:

myGroupBox.setLayout(layoutB)

但是出现了一个警告……

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

有没有办法避免这个警告?在尝试分配另一个布局之前,如何从我的组框中移除一个布局?

1 个回答

3

为了给一个小部件设置一个新的“顶层”布局,你需要先删除当前的布局和它下面的所有子项。删除子项比较简单,但要删除布局本身,就需要用到sip模块来强制删除。

下面是一个实现的例子:

from PyQt5 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 = QtWidgets.QWidget(self)
    layout = QtWidgets.QVBoxLayout(self.widget)
    layout.setContentsMargins(0, 0, 0, 0)
    self.vbox1 = QtWidgets.QVBoxLayout()
    self.vbox2 = QtWidgets.QVBoxLayout()
    layout.addLayout(vbox1)
    ...

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

撰写回答