[PyKDE] ref counting
Phil Thompson
phil at riverbankcomputing.co.uk
Sat Feb 14 08:26:01 GMT 2004
On Saturday 14 February 2004 07:49, Stefan Seefeld wrote:
> Phil Thompson wrote:
> > On Saturday 14 February 2004 04:46, Stefan Seefeld wrote:
> >>hi there,
> >>
> >>I'm experimenting with pyqt and I'm running in
> >>some strange behavior.
> >>The examples3/canvas/canvas.py demo contains
> >>the following lines:
> >>
> >> def newView(self):
> >> self.m=Main(self.canvas,None,"new windiw",Qt.WDestructiveClose)
> >> qApp.setMainWidget(self.m)
> >> self.m.show()
> >> qApp.setMainWidget(None)
> >>
> >>What I'm wondering about is the reason for the 'Main' instance to
> >>be stored in an attribute. In fact, if I replace 'self.m' by 'm'
> >>the applet doesn't work any more, i.e. as soon as I create the
> >>second view the first will be destructed. What's the reason for
> >>this ? It appears the ref count for the view drops to zero so
> >>it gets destroyed...
> >
> > Correct, 'm' is garbage collected when newView() returns, 'self.m' is
> > garbage collected when 'self' is garbage collected.
> >
> >>But in the above, it would seem the second call to 'newView' would
> >>free the first view, and thus destroy it, too. That, however, is
> >>not the case.
> >
> > But the second call to newView() has a different self.
>
> How so ? Is it not the 'self' of the view containing the menu I clicked on
> ? A little try showed the same value for 'id(self)' if I call 'newView'
> multiple times.
If you repeatedly click on New View in the same view then previous views get
garbage collected.
If you click on New View in a new view then another view is created.
This is consistent with the code, but is a bug because the code is a Python
translation of the original C++ and doesn't take full account of the garbage
collection issue.
The attached patch fixes the behaviour.
> I guess I need to understand the 'setMainWidget' trick in order to see
> why it works. 'm' is set to be the main widget, then it is mapped, then
> 'None' is set to be the main widget. What does this call do ? (I note
> it's also in the C++ example, so it probably isn't related to python's
> ref counting).
No, it's nothing to do with the reference counting.
Phil
-------------- next part --------------
A non-text attachment was scrubbed...
Name: canvas.py.patch
Type: text/x-diff
Size: 914 bytes
Desc: not available
Url : http://www.riverbankcomputing.com/pipermail/pyqt/attachments/20040214/588f1d25/canvas.py.bin
More information about the PyQt
mailing list