On Sunday 27 July 2003 05:04 am, Phil Thompson wrote: > On Saturday 26 July 2003 9:25 pm, Jacob M. Burbach wrote: > > On Saturday 26 July 2003 03:22 pm, Jacob M. Burbach wrote: > > > What is the proper way to remove and destroy an object from a > > > QWidgetStack? > > > > > > I tried: > > > object = widgetStack.widget( objectId ) > > > widgetStack.removeWidget( object ) > > > del object > > > > > > However it doesn't seem to call the destructor of that object, causing > > > a memory leak. What is the proper way to do this to make sure the > > > object really gets destroyed? > > > > > > > > > _______________________________________________ > > > PyKDE mailing list [EMAIL PROTECTED] > > > http://mats.imk.fraunhofer.de/mailman/listinfo/pykde > > > > Update, after doing a quick check, I see I have to call > > QWidgetStack.removeChild to actually decrease the reference count > > > > Example: > > object = widgetStack.widget( objectId ) > > widgetStack.removeWidget( object ) > > widgerStack.removeChild(object) > > print sys.getrefcount(object) > > del object > > > > Which says it has 2 references, one would be the object variable, so > > apparently I have an extra reference laying around somewhere... > > When you add a widget to a QWidgetStack ownership is transfered to C++ > because the widget is re-parented and so it's C++ dtor will be called as a > consequence of the QWidgetStack's dtor being called. When ownership is > transfered, the reference count is incremented - so that, if ownership is > transfered back, the original Python object (including it's specific type) > is returned. > > You might expect ownership of the widget to be transfered back to Python > when you call removeWidget(). It isn't because the widget isn't removed > from the QWidgetStack's children. Another option, other that removeChild(), > would be to reparent() the child and give it a new parent of None. > > Phil > > Unfortunately calling either removeChild, or using reparent with a None parent, both caused my app to eventually crash when exiting. Any idea what may cause the crash? The only thing I can think of is maybe python wasn't aware the C++ object had been destroyed, and eventually tried to call its destructor when the app exited?
I did find a solution in an old post by Jim Bublitz; >Originally posted by Jim Bublitz > def removeWidget (self, w) #w is a QWidget/QObject descendant > dummy = QWidget () > w.reparent (dummy, QPoint (0, 0)) > # when dummy goes out of scope, it gets garbage collected > # along with all of it's children (and the corresponding > # C++ objects get destroyed as well) > >The way Qt handles the above is different than the way >'removeChild' followed by 'del w' would work. So now in my app I retrieve the widget from the stack, then send it to a function like above to get destroyed. This works good, and my app doesn't crash. It may be worth noting, this is a KDE app, using PyQt-3.5 with PyKDE, and the widgets stored in the stack are from KDE. _______________________________________________ PyKDE mailing list [EMAIL PROTECTED] http://mats.imk.fraunhofer.de/mailman/listinfo/pykde