[PyKDE] drawing on QCanvas not working

Phil Thompson phil at river-bank.demon.co.uk
Tue May 8 06:25:48 BST 2001


Peter Hinely wrote:
> 
> Hi,
> 
> Phil Thompson wrote:
> 
> > Remember that sometimes you need to keep explicit references to widgets
> > to stop them from being garbage collected. (Hint: item => self.item,
> > newCanvas => self.newCanvas.)
> 
> It works now.  Thank you very much.  That was my first python program.
> 
> But I'm quite confused by this behavior.  Is it some artifact brought on
> by the interface between Python and C++ objects?  Surely pure Python would
> not behave this way, right?
> 
> Calling
>   setCentralWidget(self.canvasView)
> should have prevented the QCanvasView from being destructed because the
> main window maintains a reference to the canvasView.
> 
>   QCanvasView(self.newCanvas, self)
> should have prevented the canvas object from being destructed because the
> QCanvasView maintains a reference to the canvas.
> 
> and
>   QCanvasEllipse(20, 20, self.newCanvas)
> should have prevented the ellipse from being destructed.
> 
> It's not clear to me why I need to maintain an explicit reference to these
> objects in my app.

There is a difference between keeping a reference and taking
responsibility for calling an object's dtor - it's the latter that is
important. setCentralWidget() keeps a reference but does not take the
responsibility for calling the dtor - therefore it is left to the Python
garbage collector.

Most of the time this is not a problem - when a QObject is added as a
child of a parent QObject, the parent takes reponsibility for the child
so you don't have to keep an explicit reference to the child yourself.
This covers 95% of cases. Unfortunately QCanvas and QCanvasItem don't
follow this model - which I think is a design bug. (I often think that
QCanvas was written by somebody else and adopted by Trolltech.)

Phil




More information about the PyQt mailing list