[PyKDE] stale C++ pointer?
Chris Jones
cdj at mail.lns.cornell.edu
Wed Aug 4 21:46:01 BST 2004
I am new to PyQt but having read through all the documentation I can
find about object ownership policy with PyQt I believe I have found a
bug which is causing a Python object to hold a stale C++ pointer.
For reference I am developing on Mac OS X v 10.3.4 using PyQt 3.12, sip
4.0.1, Mac Qt 3.2.3 and Python 2.3.4.
I have a class that is handed a QMouseEvent in the class' __init__
method where I obtained the mouse events position (a QPoint) by doing
self._start = event.pos()
then in a member method I make use of self._start. Unfortunately, the
values returned from self._start.x() and self._start.y() that I get
when called from the other member method are completely erroneous.
However, If I change my __init__ method so I explicitly create a new
QPoint, i.e.
self._start = QPoint( event.pos() )
then the values returned from self._start.x() (and .y()) are what they
are supposed to be.
My conclusion is the underlying C++ object returned from the initial
call to event.pos() is only correct during the scope of the __init__
call and has been deleted by the time I entry my other member method,
even though I have a reference to the wrapping Python object.
Looking at the wrapping code for the QMouseEvent::pos() routine I find
const QPoint *sipRes;
sipRes = &sipCpp -> QMouseEvent::pos();
return sipMapCppToSelf(const_cast<QPoint
*>(sipRes),sipClass_QPoint);
So the question is, is the address held by 'sipRes' the c++ object that
ultimately gets held by the Python wrapping object? If so, then it is
easy to see why that becomes a stale pointer (since the QPoint is
'deleted' when the QMouseEvent goes out of scope). If this is not the
case, then there appears to be another problem with PyQt's C++ object
handling.
Chris
More information about the PyQt
mailing list