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

_______________________________________________
PyKDE mailing list    [EMAIL PROTECTED]
http://mats.imk.fraunhofer.de/mailman/listinfo/pykde

Reply via email to