On Thu, 03 Jul 2008 16:04:42 +0200, Giovanni Bajo <[EMAIL PROTECTED]> wrote: > Hi Phil, > > with SIP 4.7.6, PyQt 4.2.2, Qt 4.4.0: > > ======================================== > import sip > import weakref > from PyQt4.Qt import * > > class MyWidget(QWidget): > def sizeHint(self): > return QSize(900, 700) > > app = QApplication([]) > > ws = MyWidget(None) > wr = weakref.ref(ws) > > L = QVBoxLayout(None) > L.addWidget(ws) > L.activate() > del L > del ws > > import gc > gc.collect() > > assert wr() is None > ======================================== > > The assert triggers, meaning that the object of type MyWidget is not > released.
This appears to be a Qt problem. Although the docs say that a layout takes ownership of the widget when addWidget() is called it leaves the destruction of the widget to the eventual owner of the layout and doesn't call the widget's dtor itself. If the layout is never used (ie. never passed as an argument to QWidget.setLayout()) then all the widgets in the layout will leak. An equivalent C++ version behaves in the same way. I could change addWidget() so that the layout doesn't take ownership of the widget (ie. to match the implementation rather than the documentation) but that will break any code that creates a populated layout and returns it from a function. Phil _______________________________________________ PyQt mailing list PyQt@riverbankcomputing.com http://www.riverbankcomputing.com/mailman/listinfo/pyqt