有没有办法清除(删除)布局中的所有小部件?
self.plot_layout = QtGui.QGridLayout()
self.plot_layout.setGeometry(QtCore.QRect(200,200,200,200))
self.root_layout.addLayout(self.plot_layout)
self.plot_layout.addWidget(MyWidget())
Run Code Online (Sandbox Code Playgroud)
现在我想plot_layout用新的小部件替换小部件.是否有一种简单的方法可以清除所有小部件plot_layout?我没有看到任何这样的方法.
我有一个小部件,当切换选项时,它会发生变化.这会使所有布局和小部件无效.我保留所有布局的列表,所以我可以使用类似于这个答案的东西删除它们:
class MyWidget(QFrame):
# ...
def reLayout(self):
def deleteLayoutChilds(l):
while l.count():
item=l.takeAt(0)
widget=item.widget()
if widget: widget.deleteLater()
else: deleteLayoutChilds(item.layout())
for l in self.allLayouts: deleteLayoutChilds(l)
# now install the new layout
##
## how to delete the old layout first?
l=self.layout(); del l # no effect
#
layout=QGridLayout(self)
## warning: QLayout: Attempting to add QLayout "" to MyWidget "", which already has a layout.
Run Code Online (Sandbox Code Playgroud)
如何摆脱旧布局并设置新布局?
文档非常简洁,显然不能直接应用于python:
QWidget.setLayout(self,QLayout)
QLayout论证将其所有权转移到Qt.
将此窗口小部件的布局管理器设置为布局.
如果此窗口小部件上已安装布局管理器,则QWidget将不允许您安装另一个布局管理器.您必须先删除现有布局管理器(由layout()返回),然后才能使用新布局调用setLayout().
如果layout是不同小部件上的布局管理器,则setLayout()将重新布局布局并使其成为此小部件的布局管理器.
例:
Run Code Online (Sandbox Code Playgroud)QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(formWidget); …