Python: 如何在PyQt中取消GroupBox的布局分配
一个组框:
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)