[PyQt] Completely removing items from a layout
Baz Walter
bazwal at ftml.net
Sat Nov 28 15:10:27 GMT 2009
Lee Harr wrote:
> I wrote about this a couple of weeks ago, but I did not have a small
> working example to show the problem I'm having. Now I do.
>
>
> I have a layout created in Qt4 Designer which I fill with a series of
> complex layouts at runtime. That works great. Later on, I want
> to completely remove all of them and fill it up again with a
> different set.
>
> The re-filling up part works fine, but the original set of items is
> still visible and I can't work out how to get rid of them completely.
>
>
> The code looks something like the following. Resize the window and
> you will see a blob that is the leftovers from the first call to fillup()
>
>
>
> import sys
> from PyQt4 import QtGui
>
> class Ui_MainWindow(object):
> def setupUi(self, MainWindow):
> self.centralwidget = QtGui.QWidget(MainWindow)
> self.verticalLayout = QtGui.QVBoxLayout(self.centralwidget)
> MainWindow.setCentralWidget(self.centralwidget)
>
>
> class L2(QtGui.QHBoxLayout):
> # Represents a more complex layout to be placed inside verticalLayout
> def __init__(self, name):
> QtGui.QHBoxLayout.__init__(self)
> nm = QtGui.QLabel(name)
> self.addWidget(nm)
>
>
> class MainWindow(QtGui.QMainWindow):
> def __init__(self):
> QtGui.QMainWindow.__init__(self)
> self.ui = Ui_MainWindow()
> self.ui.setupUi(self)
> self.fillup()
> self.unfill()
> self.fillup()
>
> def fillup(self):
> for name in [str(n) for n in range(10)]:
> txt = name*20
> self.ui.verticalLayout.addLayout(L2(txt))
>
> def unfill(self):
> # This is the troublesome one.
> # How do I get rid of the contents of the layout completely?
>
> vl = self.ui.verticalLayout
> while vl.count():
> item = vl.itemAt(0)
> vl.removeItem(item)
you need to delete both the layouts and their contents:
def unfill(self):
def deleteItems(layout):
if layout is not None:
while layout.count():
item = layout.takeAt(0)
widget = item.widget()
if widget is not None:
widget.deleteLater()
else:
deleteItems(item.layout())
deleteItems(self.ui.verticalLayout)
>
> if __name__ == '__main__':
> app = QtGui.QApplication(sys.argv)
> win = MainWindow()
> win.show()
> app.exec_()
More information about the PyQt
mailing list