This is not specific to Raspbian, but happens on all systems where qreal == float (i.e. all ARM systems). This particular issue happens because in qbrush.sip we have:
typedef QVector<QPair<double, QColor>> QGradientStops; while in Qt 5.1 qreal is used instead of double: typedef QPair<qreal, QColor> QGradientStop; typedef QVector<QGradientStop> QGradientStops; However, this is not the only issue that makes the build fail. In Debian, we have a patch that fixes more issues. We haven't yet finished updating it for PyQt5, so it doesn't fully solve the problem (any help in finalizing it is appreciated). I have attached the current version of that patch. -- Dmitry Shachnev
## 03_qreal_float_support.dpatch by Michael Casadevall <sonicmcta...@gmail.com> --- a/configure.py +++ b/configure.py @@ -406,8 +406,9 @@ out << "PyQt_NoOpenGLES\\n"; #endif - if (sizeof (qreal) != sizeof (double)) +#if defined(QT_NO_FPU) || defined(QT_ARCH_ARM) || defined(QT_ARCH_WINDOWSCE) out << "PyQt_qreal_double\\n"; +#endif return 0; } --- a/sip/QtCore/qlist.sip +++ b/sip/QtCore/qlist.sip @@ -798,3 +798,222 @@ return sipGetState(sipTransferObj); %End }; + +// If we're on an architecture where qreal != double, then we need to also +// explicately handle doubles. On architectures where qreal == double, they +// will automaticially be cast upwards + +%If (!PyQt_qreal_double) + +// QList<QPair<double, double> > is implemented as a Python list of 2-element tuples. +%MappedType QList<QPair<double, double> > +{ +%TypeHeaderCode +#include <qlist.h> +#include <qpair.h> +%End + +%ConvertFromTypeCode + // Create the list. + PyObject *l; + + if ((l = PyList_New(sipCpp->size())) == NULL) + return NULL; + + // Set the list elements. + for (int i = 0; i < sipCpp->size(); ++i) + { + const QPair<double, double> &p = sipCpp->at(i); + PyObject *pobj; + + if ((pobj = Py_BuildValue((char *)"dd", p.first, p.second)) == NULL) + { + Py_DECREF(l); + + return NULL; + } + + PyList_SET_ITEM(l, i, pobj); + } + + return l; +%End + +%ConvertToTypeCode + SIP_SSIZE_T len; + + // Check the type if that is all that is required. + if (sipIsErr == NULL) + { + if (!PySequence_Check(sipPy) || (len = PySequence_Size(sipPy)) < 0) + return 0; + + for (SIP_SSIZE_T i = 0; i < len; ++i) + { + PyObject *tup = PySequence_ITEM(sipPy, i); + + if (!PySequence_Check(tup) || PySequence_Size(tup) != 2) + return 0; + } + + return 1; + } + + QList<QPair<double, double> > *ql = new QList<QPair<double, double> >; + len = PySequence_Size(sipPy); + + for (SIP_SSIZE_T i = 0; i < len; ++i) + { + PyObject *tup = PySequence_ITEM(sipPy, i); + + double first = PyFloat_AsDouble(PySequence_ITEM(tup, 0)); + double second = PyFloat_AsDouble(PySequence_ITEM(tup, 1)); + + ql->append(QPair<double, double>(first, second)); + } + + *sipCppPtr = ql; + + return sipGetState(sipTransferObj); +%End +}; +// QList<QPair<double, TYPE> > is implemented as a Python list of 2-element tuples. +template<double, TYPE> +%MappedType QList<QPair<double, TYPE> > +{ +%TypeHeaderCode +#include <qlist.h> +#include <qpair.h> +%End + +%ConvertFromTypeCode + // Create the list. + PyObject *l; + + if ((l = PyList_New(sipCpp->size())) == NULL) + return NULL; + + // Set the list elements. + for (int i = 0; i < sipCpp->size(); ++i) + { + const QPair<double, TYPE> &p = sipCpp->at(i); + TYPE *t = new TYPE(p.second); + PyObject *pobj; + + if ((pobj = sipBuildResult(NULL, "(dB)", p.first, t, sipClass_TYPE, sipTransferObj)) == NULL) + { + Py_DECREF(l); + delete t; + + return NULL; + } + + PyList_SET_ITEM(l, i, pobj); + } + + return l; +%End + +%ConvertToTypeCode + SIP_SSIZE_T len; + + // Check the type if that is all that is required. + if (sipIsErr == NULL) + { + if (!PySequence_Check(sipPy) || (len = PySequence_Size(sipPy)) < 0) + return 0; + + for (SIP_SSIZE_T i = 0; i < len; ++i) + { + PyObject *tup = PySequence_ITEM(sipPy, i); + + if (!PySequence_Check(tup) || PySequence_Size(tup) != 2) + return 0; + + if (!sipCanConvertToInstance(PySequence_ITEM(tup, 1), sipClass_TYPE, SIP_NOT_NONE)) + return 0; + } + + return 1; + } + + QList<QPair<double, TYPE> > *ql = new QList<QPair<double, TYPE> >; + len = PySequence_Size(sipPy); + + for (SIP_SSIZE_T i = 0; i < len; ++i) + { + PyObject *tup = PySequence_ITEM(sipPy, i); + double d; + int state; + + d = PyFloat_AsDouble(PySequence_ITEM(tup, 0)); + TYPE *t = reinterpret_cast<TYPE *>(sipConvertToInstance(PySequence_ITEM(tup, 1), sipClass_TYPE, sipTransferObj, SIP_NOT_NONE, &state, sipIsErr)); + + if (*sipIsErr) + { + sipReleaseInstance(t, sipClass_TYPE, state); + + delete ql; + return 0; + } + + ql->append(QPair<double, TYPE>(d, *t)); + + sipReleaseInstance(t, sipClass_TYPE, state); + } + + *sipCppPtr = ql; + + return sipGetState(sipTransferObj); +%End +}; +// QList<double> is implemented as a Python list of doubles. +%MappedType QList<double> +{ +%TypeHeaderCode +#include <qlist.h> +%End + +%ConvertFromTypeCode + // Create the list. + PyObject *l; + + if ((l = PyList_New(sipCpp->size())) == NULL) + return NULL; + + // Set the list elements. + for (int i = 0; i < sipCpp->size(); ++i) + { + PyObject *pobj; + + if ((pobj = PyFloat_FromDouble(sipCpp->value(i))) == NULL) + { + Py_DECREF(l); + + return NULL; + } + + PyList_SET_ITEM(l, i, pobj); + } + + return l; +%End + +%ConvertToTypeCode + // Check the type if that is all that is required. + if (sipIsErr == NULL) + return (PySequence_Check(sipPy) && PySequence_Size(sipPy) >= 0); + + QList<double> *ql = new QList<double>; + SIP_SSIZE_T len = PySequence_Size(sipPy); + + for (SIP_SSIZE_T i = 0; i < len; ++i) + ql->append(PyFloat_AsDouble(PySequence_ITEM(sipPy, i))); + + *sipCppPtr = ql; + + return sipGetState(sipTransferObj); +%End +}; + +%End --- a/sip/QtGui/qbrush.sip +++ b/sip/QtGui/qbrush.sip @@ -119,7 +119,7 @@ QDataStream &operator>>(QDataStream &, QBrush & /Constrained/) /ReleaseGIL/; QDataStream &operator<<(QDataStream &, const QBrush & /Constrained/) /ReleaseGIL/; -typedef QVector<QPair<double, QColor>> QGradientStops; +typedef QVector<QPair<qreal, QColor>> QGradientStops; class QGradient {
_______________________________________________ PyQt mailing list PyQt@riverbankcomputing.com http://www.riverbankcomputing.com/mailman/listinfo/pyqt