我试图找到一些可以使用qt布局并从中删除所有内容的东西。只是想像一下窗口是什么样子-我有:
QVBoxLayout | ------QHboxLayout |---------QWidget | ------QHboxLayout |---------QWidget .........
所以我需要可以递归调用的东西,以清除并删除父母的所有东西QVBoxLayout。我尝试了这里提到的事情(在pyqt中清除布局中的所有小部件),但是它们都不起作用(无论如何都没有标记正确答案)。我的代码如下所示:
QVBoxLayout
def clearLayout(self, layout): for i in range(layout.count()): if (type(layout.itemAt(i)) == QtGui.QHBoxLayout): print "layout " + str(layout.itemAt(i)) self.clearLayout(layout.itemAt(i)) else: print "widget" + str(layout.itemAt(i)) layout.itemAt(i).widget().close()
但这给出了一个错误:
layout.itemAt(i).widget().close() AttributeError: 'NoneType' object has no attribute 'close'
=>编辑这种方法很有效(但是,Layout除了HBoxLayout:
Layout
HBoxLayout
def clearLayout(self, layout): layouts = [] for i in range(layout.count()): if (type(layout.itemAt(i)) == QtGui.QHBoxLayout): print "layout " + str(layout.itemAt(i)) self.clearLayout(layout.itemAt(i)) layouts.append(layout.itemAt(i)) else: print "widget" + str(layout.itemAt(i)) if (type(layout.itemAt(i)) == QtGui.QWidgetItem): layout.itemAt(i).widget().close()
清除布局的最安全方法是使用其takeAt方法提取项目,然后使用deleteLater明确删除所有小部件:
def clearLayout(self, layout): if layout is not None: while layout.count(): item = layout.takeAt(0) widget = item.widget() if widget is not None: widget.deleteLater() else: self.clearLayout(item.layout())