清除PyQt布局中的所有小部件

64

有没有一种方法可以清除(删除)布局中的所有小部件?

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中的所有窗口小部件?我没有看到任何方法可以这样做。

14个回答

1
for i in reversed(range(layout.count())):
    if layout.itemAt(i).widget():
        layout.itemAt(i).widget().setParent(None)
    else:
        layout.removeItem(layout.itemAt(i))

1

如果您正在使用堆叠小部件在已知视图之间进行切换并且只是翻转显示的索引,则可能比从布局中添加和删除单个小部件要容易得多。

如果您想要替换小部件的所有子级,则QObject函数findChildren应该能够帮助您达到目的。例如,我不知道模板函数在pyqt中如何包装。但是,如果您知道它们的名称,也可以按名称搜索小部件。


这是我第一个Qt应用程序(除了简单地尝试一下)所以我肯定在很多事情上效率很低。目前,plot_layout每次只有一个小部件(我将其设置为网格布局以便未来扩展)。它包含的小部件是一个自定义小部件,它扩展了matplotlib的FigureCanvasQTAgg。我有很多图表,我想要做的是当用户在树视图中点击一个图表时(这个已经实现),我想显示那个图表。 - Falmarri
也许将绘图代码从“FigureCanvasQTAgg”子类移动到单独的位置会是一个更好的主意,只需在请求时更新给定的“Figure”。然后,您可以简单地重新绘制图形,而不必搞乱小部件和布局。请参见http://eli.thegreenplace.net/files/prog_code/qt_mpl_bars.py.txt以获取示例代码。 - Ferdinand Beyer

0
        for i in reversed (range(layout.count())):
            layout.itemAt(i).widget().close()
            layout.takeAt(i)

或者

        for i in range(layout.count()):
            layout.itemAt(0).widget().close()
            layout.takeAt(0)

0
如果您有嵌套布局但只想删除小部件,可能会出现问题。 如果您检查项目类型并且该项目是布局,可以通过递归调用该函数来解决问题。
def clearLayout(layout):
    for i in reversed(range(layout.count())): 
        child = layout.itemAt(i)
        if child.widget() is not None:
            child.widget().deleteLater()
        elif child.layout() is not None:
            clearLayout(child.layout())

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接