在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

上一篇: Clear all widgets in a layout in pyqt

下一篇: PyQt, widget do not shown