Hans-Peter Jansen
Wed, 14 May 2008 16:18:14 -0700
Am Mittwoch, 14. Mai 2008 schrieb Hans-Peter Jansen: > Am Mittwoch, 14. Mai 2008 schrieb Phil Thompson: > > On Saturday 10 May 2008 22:43:34 Hans-Peter Jansen wrote: > > > Hi, > > > > > > for optimizing reasons, I'm desperately missing the QRegion.rects() > > > method. Background is a special double buffering widget, where bitblt > > > in the paintEvent reimplementation of the full event.rect() is > > > painfully slow, while only a margin area is really modified. The only > > > way to really get at the these areas is QRegion.rects(), which is not > > > implemented in PyQt3. (By the way, even the deactivated signature in > > > sip/qt/qregion.sip is wrong, QRegion.rects() returns a > > > QMemArray<QRect>, not a QArray<Rect> (anymore?)). > > > > Just pasting in the QList<TYPE> implementation from PyQt4 into PyQt3's > > qmemarray.sip should work - and change the "QList" etc to "QMemArray". Phil, as promised, here's the patch. Works like a charm. I'm sure that without your help, I wouldn't have managed to solve this on my own. With your hints, it was a piece of cake... :-) Thanks a lot, Pete
--- PyQt-x11-gpl-3.17.4/sip/qt/qregion.sip.orig 2007-12-06 15:28:07.000000000 +0100
+++ PyQt-x11-gpl-3.17.4/sip/qt/qregion.sip 2008-05-14 23:40:14.659129172 +0200
@@ -100,7 +100,7 @@ public:
QRegion eor(const QRegion &) const;
QRect boundingRect() const;
-// QArray<QRect> rects() const;
+ QMemArray<QRect> rects() const;
%If (Qt_2_2_0 -)
// void setRects(const QRect *,int);
%End
--- PyQt-x11-gpl-3.17.4/sip/qt/qmemarray.sip.orig 2007-12-06 15:28:07.000000000 +0100
+++ PyQt-x11-gpl-3.17.4/sip/qt/qmemarray.sip 2008-05-15 00:05:08.247037196 +0200
@@ -89,4 +89,81 @@ converted to and from Python lists of th
%End
};
+// QMemArray<TYPE> is implemented as a Python list.
+template<TYPE>
+%MappedType QMemArray<TYPE>
+{
+%TypeHeaderCode
+#include <qmemarray.h>
+%End
+
+%ConvertFromTypeCode
+ // Create the list.
+ PyObject *l;
+
+ if ((l = PyList_New(sipCpp->size())) == NULL)
+ return NULL;
+
+ // Set the list elements.
+ for (uint i = 0; i < sipCpp->size(); ++i)
+ {
+ TYPE *t = new TYPE(sipCpp->at(i));
+ PyObject *tobj;
+
+ if ((tobj = sipConvertFromNewInstance(t, sipClass_TYPE, sipTransferObj)) == NULL)
+ {
+ Py_DECREF(l);
+ delete t;
+
+ return NULL;
+ }
+
+ PyList_SET_ITEM(l, i, tobj);
+ }
+
+ return l;
+%End
+
+%ConvertToTypeCode
+ // Check the type if that is all that is required.
+ if (sipIsErr == NULL)
+ {
+ if (!PyList_Check(sipPy))
+ return 0;
+
+ for (int i = 0; i < PyList_GET_SIZE(sipPy); ++i)
+ if (!sipCanConvertToInstance(PyList_GET_ITEM(sipPy, i), sipClass_TYPE, SIP_NOT_NONE))
+ return 0;
+
+ return 1;
+ }
+
+ QMemArray<TYPE> *ql = new QMemArray<TYPE>;
+
+ for (int i = 0; i < PyList_GET_SIZE(sipPy); ++i)
+ {
+ int state;
+ TYPE *t = reinterpret_cast<TYPE *>(sipConvertToInstance(PyList_GET_ITEM(sipPy, i), sipClass_TYPE, sipTransferObj, SIP_NOT_NONE, &state, sipIsErr));
+
+ if (*sipIsErr)
+ {
+ sipReleaseInstance(t, sipClass_TYPE, state);
+
+ delete ql;
+ return 0;
+ }
+
+ uint idx = ql->size();
+ ql->resize(idx + 1);
+ (*ql)[idx] = *t;
+
+ sipReleaseInstance(t, sipClass_TYPE, state);
+ }
+
+ *sipCppPtr = ql;
+
+ return sipGetState(sipTransferObj);
+%End
+};
+
%End
_______________________________________________ PyQt mailing list PyQt@riverbankcomputing.com http://www.riverbankcomputing.com/mailman/listinfo/pyqt