组合框:
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中删除布局?
答案 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)