[PyKDE] Properly deleting objects from a QWidgetStack
Jacob M. Burbach
stolenID at cfl.rr.com
Sun Jul 27 23:35:00 BST 2003
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 PyKDE at mats.imk.fraunhofer.de
> > > 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.
More information about the PyQt
mailing list