在pyqt中清除布局中的所有小部件
有没有办法清除(删除)布局中的所有小部件?
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())
现在我想用一个新的小部件替换plot_layout
中的小部件。 有没有简单的方法来清除plot_layout
所有小部件? 我没有看到任何方法。
经过大量研究(并且这个花了相当多的时间,所以我将它添加到这里供将来参考),这是我发现的真正清除和删除布局中的小部件的方式:
for i in reversed(range(layout.count())):
layout.itemAt(i).widget().setParent(None)
文档中提到的有关QWidget的是:
当新的小部件被删除时,它将被删除。
重要提示:您需要向后循环,因为从开始处移除项目会改变项目并更改布局中项目的顺序。
要测试并确认布局为空:
for i in range(layout.count()): print i
似乎有另一种方式来做到这一点。 而不是使用setParent函数,像这样使用deleteLater()函数:
for i in reversed(range(layout.count())):
layout.itemAt(i).widget().deleteLater()
该文件说, QObject.deleteLater(self)
计划删除此对象。
但是,如果您运行上面指定的测试代码,则会打印一些值。 这表明布局仍然有项目,而不是带有setParent的代码。
这可能有点晚,但只是想补充一点以备将来参考:
def clearLayout(layout):
while layout.count():
child = layout.takeAt(0)
if child.widget():
child.widget().deleteLater()
改编自Qt文档http://doc.qt.io/qt-5/qlayout.html#takeAt。 请记住,当你在一段时间内从布局中删除子项或循环时,您正在有效地修改布局中每个子项目的索引编号。 这就是为什么你会遇到for i in range()
循环中使用for i in range()
问题。
如果您不需要将新的小部件放到您的布局中,PALEN的答案会很好。
for i in reversed(range(layout.count())):
layout.itemAt(i).widget().setParent(None)
但是,如果您多次清空并用多个小部件填充布局,您将在某个时刻出现“分段错误(核心转储)”。 似乎布局保留了一个小部件列表,并且这个列表的大小是有限的。
如果您以这种方式删除小部件:
for i in reversed(range(layout.count())):
widgetToRemove = layout.itemAt( i ).widget()
# remove it from the layout list
layout.removeWidget( widgetToRemove )
# remove it from the gui
widgetToRemove.setParent( None )
你不会遇到这个问题。
链接地址: http://www.djcxy.com/p/77399.html