upstream fixes related to Qt Quick support
authorPhil Thompson <phil@riverbankcomputing.com>
Thu, 10 May 2018 12:38:28 +0000 (15:38 +0300)
committerDmitry Shachnev <mitya57@debian.org>
Thu, 10 May 2018 14:09:00 +0000 (15:09 +0100)
- Handle QQuickWindow and QQuickView as special cases (cf. QQuickItem)
  when exposing sub-classes to QML.
- Fixed the handling of QQuickItem and similar classes so that the
  correct meta-object is returned by metaObject().
- Improved the fix for QtQuick meta-objects so that the
  customgeometry.py example works again.

Origin: upstream, changesets 78085eee5e7e8bf883e1619f and 7facd5e24cbb

Gbp-Pq: Name cura_crash.diff

13 files changed:
qpy/QtQuick/qpyquick_register_type.cpp
qpy/QtQuick/qpyquickframebufferobject.cpp
qpy/QtQuick/qpyquickframebufferobject.h
qpy/QtQuick/qpyquickitem.cpp
qpy/QtQuick/qpyquickitem.h
qpy/QtQuick/qpyquickpainteditem.cpp
qpy/QtQuick/qpyquickpainteditem.h
qpy/QtQuick/qpyquickview.cpp [new file with mode: 0644]
qpy/QtQuick/qpyquickview.h [new file with mode: 0644]
qpy/QtQuick/qpyquickwindow.cpp [new file with mode: 0644]
qpy/QtQuick/qpyquickwindow.h [new file with mode: 0644]
sip/QtQuick/qquickview.sip
sip/QtQuick/qquickwindow.sip

index eb7caf56ecce38eebb4b31bc7c8db39954df1bd1..780df6c3a32572391d9edddda1e418bf14d5c2c1 100644 (file)
@@ -22,6 +22,8 @@
 #include "qpyquickframebufferobject.h"
 #include "qpyquickitem.h"
 #include "qpyquickpainteditem.h"
+#include "qpyquickview.h"
+#include "qpyquickwindow.h"
 
 #include "sipAPIQtQuick.h"
 
@@ -30,6 +32,9 @@ sipErrorState qpyquick_register_type(PyTypeObject *py_type,
         const QMetaObject *mo, const QByteArray &ptr_name,
         const QByteArray &list_name, QQmlPrivate::RegisterType **rtp)
 {
+    // Make sure the types are tested in the right order (ie. more specific
+    // types first).
+
 #if QT_VERSION >= 0x050200
     if (PyType_IsSubtype(py_type, sipTypeAsPyTypeObject(sipType_QQuickFramebufferObject)))
         return ((*rtp = QPyQuickFramebufferObject::addType(py_type, mo, ptr_name, list_name)) ? sipErrorNone : sipErrorFail);
@@ -41,6 +46,12 @@ sipErrorState qpyquick_register_type(PyTypeObject *py_type,
     if (PyType_IsSubtype(py_type, sipTypeAsPyTypeObject(sipType_QQuickItem)))
         return ((*rtp = QPyQuickItem::addType(py_type, mo, ptr_name, list_name)) ? sipErrorNone : sipErrorFail);
 
+    if (PyType_IsSubtype(py_type, sipTypeAsPyTypeObject(sipType_QQuickView)))
+        return ((*rtp = QPyQuickView::addType(py_type, mo, ptr_name, list_name)) ? sipErrorNone : sipErrorFail);
+
+    if (PyType_IsSubtype(py_type, sipTypeAsPyTypeObject(sipType_QQuickWindow)))
+        return ((*rtp = QPyQuickWindow::addType(py_type, mo, ptr_name, list_name)) ? sipErrorNone : sipErrorFail);
+
     // We don't recognise the type.
     return sipErrorContinue;
 }
index c00eefbcbf4924c14b4efa08c13dc214d107bc6c..6fc84dcf35cf6f93c65c809ad545b7b8a86accc3 100644 (file)
@@ -37,6 +37,10 @@ static QList<PyTypeObject *> pyqt_types;
 
 // The registration data for the canned types.
 static QQmlPrivate::RegisterType canned_types[NrOfQuickFramebufferObjectTypes];
+// External declarations.
+extern const QMetaObject *qpyquick_pick_metaobject(const QMetaObject *super_mo,
+        const QMetaObject *static_mo);
 
 
 #define QPYQUICKFRAMEBUFFEROBJECT_INIT(n) \
@@ -143,6 +147,10 @@ QPyQuickFramebufferObject##n::QPyQuickFramebufferObject##n(QQuickItem *parent) :
 { \
     createPyObject(parent); \
 } \
+const QMetaObject *QPyQuickFramebufferObject##n::metaObject() const \
+{ \
+    return qpyquick_pick_metaobject(QPyQuickFramebufferObject::metaObject(), &staticMetaObject); \
+} \
 QMetaObject QPyQuickFramebufferObject##n::staticMetaObject
 
 
index e910adae98dd02f6288372128b03f06bdd8afbcf..14597a61ff738945e1825e046d1f69eeed4c911b 100644 (file)
@@ -58,6 +58,7 @@ class QPyQuickFramebufferObject##n : public QPyQuickFramebufferObject \
 public: \
     QPyQuickFramebufferObject##n(QQuickItem *parent = 0); \
     static QMetaObject staticMetaObject; \
+    virtual const QMetaObject *metaObject() const; \
     virtual int typeNr() const {return n##U;} \
 private: \
     QPyQuickFramebufferObject##n(const QPyQuickFramebufferObject##n &); \
index 3022aff1bdc4a5c56fd59d00b86fa3956fb2a437..45993e7451735101470950cc1b1efc578fea53f8 100644 (file)
@@ -37,6 +37,22 @@ static QList<PyTypeObject *> pyqt_types;
 static QQmlPrivate::RegisterType canned_types[NrOfQuickItemTypes];
 
 
+// Pick the correct meta-object, either the one from the super-class or the
+// static meta-object.
+const QMetaObject *qpyquick_pick_metaobject(const QMetaObject *super_mo,
+        const QMetaObject *static_mo)
+{
+    // If a Python type has been sub-classed in QML then we need to use the
+    // QtQuick supplied meta-object.  In this case it's super-class meta-object
+    // will be the meta-object of the Python type.  Otherwise we need to use
+    // the static meta-object (which is a copy of the meta-object of the Python
+    // type).  We use the class names held by the meta-objects to determine the
+    // correct meta-object to return.
+
+    return (qstrcmp(super_mo->superClass()->className(), static_mo->className()) == 0) ? super_mo : static_mo;
+}
+
+
 #define QPYQUICKITEM_INIT(n) \
     case n##U: \
         QPyQuickItem##n::staticMetaObject = *mo; \
@@ -140,6 +156,10 @@ QPyQuickItem##n::QPyQuickItem##n(QQuickItem *parent) : QPyQuickItem(parent) \
 { \
     createPyObject(parent); \
 } \
+const QMetaObject *QPyQuickItem##n::metaObject() const \
+{ \
+    return qpyquick_pick_metaobject(QPyQuickItem::metaObject(), &staticMetaObject); \
+} \
 QMetaObject QPyQuickItem##n::staticMetaObject
 
 
index 69e4f442b1a410bfd8e6c8c1594479dc08d9d9e6..f23e9868331a8625e874f78886c47dae810f31fe 100644 (file)
@@ -56,6 +56,7 @@ class QPyQuickItem##n : public QPyQuickItem \
 public: \
     QPyQuickItem##n(QQuickItem *parent = 0); \
     static QMetaObject staticMetaObject; \
+    virtual const QMetaObject *metaObject() const; \
     virtual int typeNr() const {return n##U;} \
 private: \
     QPyQuickItem##n(const QPyQuickItem##n &); \
index f64ce7487402850c4e7652427e7b4e4dac31d31f..5534e2349d43cafb626d91e6c9f55a39584b1516 100644 (file)
@@ -36,6 +36,10 @@ static QList<PyTypeObject *> pyqt_types;
 // The registration data for the canned types.
 static QQmlPrivate::RegisterType canned_types[NrOfQuickPaintedItemTypes];
 
+// External declarations.
+extern const QMetaObject *qpyquick_pick_metaobject(const QMetaObject *super_mo,
+        const QMetaObject *static_mo);
+
 
 #define QPYQUICKPAINTEDITEM_INIT(n) \
     case n##U: \
@@ -141,6 +145,10 @@ QPyQuickPaintedItem##n::QPyQuickPaintedItem##n(QQuickItem *parent) : QPyQuickPai
 { \
     createPyObject(parent); \
 } \
+const QMetaObject *QPyQuickPaintedItem##n::metaObject() const \
+{ \
+    return qpyquick_pick_metaobject(QPyQuickPaintedItem::metaObject(), &staticMetaObject); \
+} \
 QMetaObject QPyQuickPaintedItem##n::staticMetaObject
 
 
index 76d951231d4aa83a79132ddb2580fc778c0ab49e..70ab38d809b910c1c6aa1c0b1df3c24831122cbf 100644 (file)
@@ -56,6 +56,7 @@ class QPyQuickPaintedItem##n : public QPyQuickPaintedItem \
 public: \
     QPyQuickPaintedItem##n(QQuickItem *parent = 0); \
     static QMetaObject staticMetaObject; \
+    virtual const QMetaObject *metaObject() const; \
     virtual int typeNr() const {return n##U;} \
 private: \
     QPyQuickPaintedItem##n(const QPyQuickPaintedItem##n &); \
diff --git a/qpy/QtQuick/qpyquickview.cpp b/qpy/QtQuick/qpyquickview.cpp
new file mode 100644 (file)
index 0000000..c3436b6
--- /dev/null
@@ -0,0 +1,163 @@
+// This is the implementation of the QPyQuickWindow classes.
+//
+// Copyright (c) 2018 Riverbank Computing Limited <info@riverbankcomputing.com>
+// 
+// This file is part of PyQt5.
+// 
+// This file may be used under the terms of the GNU General Public License
+// version 3.0 as published by the Free Software Foundation and appearing in
+// the file LICENSE included in the packaging of this file.  Please review the
+// following information to ensure the GNU General Public License version 3.0
+// requirements will be met: http://www.gnu.org/copyleft/gpl.html.
+// 
+// If you do not wish to use this file under the terms of the GPL version 3.0
+// then you may purchase a commercial license.  For more information contact
+// info@riverbankcomputing.com.
+// 
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+
+
+#include <Python.h>
+
+#include <QQmlListProperty>
+
+#include "qpyquickview.h"
+
+#include "sipAPIQtQuick.h"
+
+
+// The maximum number of Python QQuickView types.
+const int NrOfQuickViewTypes = 20;
+
+// The list of registered Python types.
+static QList<PyTypeObject *> pyqt_types;
+
+// The registration data for the canned types.
+static QQmlPrivate::RegisterType canned_types[NrOfQuickViewTypes];
+
+// External declarations.
+extern const QMetaObject *qpyquick_pick_metaobject(const QMetaObject *super_mo,
+        const QMetaObject *static_mo);
+
+
+#define QPYQUICKVIEW_INIT(n) \
+    case n##U: \
+        QPyQuickView##n::staticMetaObject = *mo; \
+        rt->typeId = qRegisterNormalizedMetaType<QPyQuickView##n *>(ptr_name); \
+        rt->listId = qRegisterNormalizedMetaType<QQmlListProperty<QPyQuickView##n> >(list_name); \
+        rt->objectSize = sizeof(QPyQuickView##n); \
+        rt->create = QQmlPrivate::createInto<QPyQuickView##n>; \
+        rt->metaObject = mo; \
+        rt->attachedPropertiesFunction = QQmlPrivate::attachedPropertiesFunc<QPyQuickView##n>(); \
+        rt->attachedPropertiesMetaObject = QQmlPrivate::attachedPropertiesMetaObject<QPyQuickView##n>(); \
+        rt->parserStatusCast = QQmlPrivate::StaticCastSelector<QPyQuickView##n,QQmlParserStatus>::cast(); \
+        rt->valueSourceCast = QQmlPrivate::StaticCastSelector<QPyQuickView##n,QQmlPropertyValueSource>::cast(); \
+        rt->valueInterceptorCast = QQmlPrivate::StaticCastSelector<QPyQuickView##n,QQmlPropertyValueInterceptor>::cast(); \
+        break
+
+
+// The ctor.
+QPyQuickView::QPyQuickView(QWindow *parent) : sipQQuickView(parent)
+{
+}
+
+
+// Add a new Python type and return its number.
+QQmlPrivate::RegisterType *QPyQuickView::addType(PyTypeObject *type,
+        const QMetaObject *mo, const QByteArray &ptr_name,
+        const QByteArray &list_name)
+{
+    int type_nr = pyqt_types.size();
+
+    // Check we have a spare canned type.
+    if (type_nr >= NrOfQuickViewTypes)
+    {
+        PyErr_Format(PyExc_TypeError,
+                "a maximum of %d QQuickView types may be registered with QML",
+                NrOfQuickViewTypes);
+        return 0;
+    }
+
+    pyqt_types.append(type);
+
+    QQmlPrivate::RegisterType *rt = &canned_types[type_nr];
+
+    // Initialise those members that depend on the C++ type.
+    switch (type_nr)
+    {
+        QPYQUICKVIEW_INIT(0);
+        QPYQUICKVIEW_INIT(1);
+        QPYQUICKVIEW_INIT(2);
+        QPYQUICKVIEW_INIT(3);
+        QPYQUICKVIEW_INIT(4);
+        QPYQUICKVIEW_INIT(5);
+        QPYQUICKVIEW_INIT(6);
+        QPYQUICKVIEW_INIT(7);
+        QPYQUICKVIEW_INIT(8);
+        QPYQUICKVIEW_INIT(9);
+        QPYQUICKVIEW_INIT(10);
+        QPYQUICKVIEW_INIT(11);
+        QPYQUICKVIEW_INIT(12);
+        QPYQUICKVIEW_INIT(13);
+        QPYQUICKVIEW_INIT(14);
+        QPYQUICKVIEW_INIT(15);
+        QPYQUICKVIEW_INIT(16);
+        QPYQUICKVIEW_INIT(17);
+        QPYQUICKVIEW_INIT(18);
+        QPYQUICKVIEW_INIT(19);
+    }
+
+    return rt;
+}
+
+
+// Create the Python instance.
+void QPyQuickView::createPyObject(QWindow *parent)
+{
+    SIP_BLOCK_THREADS
+
+    // Assume C++ owns everything.
+    PyObject *obj = sipConvertFromNewPyType(this, pyqt_types.at(typeNr()),
+            NULL, &sipPySelf, "D", parent, sipType_QWindow, NULL);
+
+    if (!obj)
+        pyqt5_qtquick_err_print();
+
+    SIP_UNBLOCK_THREADS
+}
+
+
+// The canned type implementations.
+#define QPYQUICKVIEW_IMPL(n) \
+QPyQuickView##n::QPyQuickView##n(QWindow *parent) : QPyQuickView(parent) \
+{ \
+    createPyObject(parent); \
+} \
+const QMetaObject *QPyQuickView##n::metaObject() const \
+{ \
+    return qpyquick_pick_metaobject(QPyQuickView::metaObject(), &staticMetaObject); \
+} \
+QMetaObject QPyQuickView##n::staticMetaObject
+
+
+QPYQUICKVIEW_IMPL(0);
+QPYQUICKVIEW_IMPL(1);
+QPYQUICKVIEW_IMPL(2);
+QPYQUICKVIEW_IMPL(3);
+QPYQUICKVIEW_IMPL(4);
+QPYQUICKVIEW_IMPL(5);
+QPYQUICKVIEW_IMPL(6);
+QPYQUICKVIEW_IMPL(7);
+QPYQUICKVIEW_IMPL(8);
+QPYQUICKVIEW_IMPL(9);
+QPYQUICKVIEW_IMPL(10);
+QPYQUICKVIEW_IMPL(11);
+QPYQUICKVIEW_IMPL(12);
+QPYQUICKVIEW_IMPL(13);
+QPYQUICKVIEW_IMPL(14);
+QPYQUICKVIEW_IMPL(15);
+QPYQUICKVIEW_IMPL(16);
+QPYQUICKVIEW_IMPL(17);
+QPYQUICKVIEW_IMPL(18);
+QPYQUICKVIEW_IMPL(19);
diff --git a/qpy/QtQuick/qpyquickview.h b/qpy/QtQuick/qpyquickview.h
new file mode 100644 (file)
index 0000000..1e12912
--- /dev/null
@@ -0,0 +1,88 @@
+// This is the definition of the QPyQuickView classes.
+//
+// Copyright (c) 2018 Riverbank Computing Limited <info@riverbankcomputing.com>
+// 
+// This file is part of PyQt5.
+// 
+// This file may be used under the terms of the GNU General Public License
+// version 3.0 as published by the Free Software Foundation and appearing in
+// the file LICENSE included in the packaging of this file.  Please review the
+// following information to ensure the GNU General Public License version 3.0
+// requirements will be met: http://www.gnu.org/copyleft/gpl.html.
+// 
+// If you do not wish to use this file under the terms of the GPL version 3.0
+// then you may purchase a commercial license.  For more information contact
+// info@riverbankcomputing.com.
+// 
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+
+
+#ifndef _QPYQUICKVIEW_H
+#define _QPYQUICKVIEW_H
+
+
+#include <Python.h>
+
+#include <qqmlprivate.h>
+#include <QByteArray>
+#include <QMetaObject>
+#include <QQuickView>
+
+#include "sipAPIQtQuick.h"
+
+
+class QPyQuickView : public sipQQuickView
+{
+public:
+    QPyQuickView(QWindow *parent = 0);
+
+    virtual int typeNr() const = 0;
+
+    static QQmlPrivate::RegisterType *addType(PyTypeObject *type,
+            const QMetaObject *mo, const QByteArray &ptr_name,
+            const QByteArray &list_name);
+    void createPyObject(QWindow *parent);
+
+private:
+    QPyQuickView(const QPyQuickView &);
+};
+
+
+// The canned type declarations.
+#define QPYQUICKVIEW_DECL(n) \
+class QPyQuickView##n : public QPyQuickView \
+{ \
+public: \
+    QPyQuickView##n(QWindow *parent = 0); \
+    static QMetaObject staticMetaObject; \
+    virtual const QMetaObject *metaObject() const; \
+    virtual int typeNr() const {return n##U;} \
+private: \
+    QPyQuickView##n(const QPyQuickView##n &); \
+}
+
+
+QPYQUICKVIEW_DECL(0);
+QPYQUICKVIEW_DECL(1);
+QPYQUICKVIEW_DECL(2);
+QPYQUICKVIEW_DECL(3);
+QPYQUICKVIEW_DECL(4);
+QPYQUICKVIEW_DECL(5);
+QPYQUICKVIEW_DECL(6);
+QPYQUICKVIEW_DECL(7);
+QPYQUICKVIEW_DECL(8);
+QPYQUICKVIEW_DECL(9);
+QPYQUICKVIEW_DECL(10);
+QPYQUICKVIEW_DECL(11);
+QPYQUICKVIEW_DECL(12);
+QPYQUICKVIEW_DECL(13);
+QPYQUICKVIEW_DECL(14);
+QPYQUICKVIEW_DECL(15);
+QPYQUICKVIEW_DECL(16);
+QPYQUICKVIEW_DECL(17);
+QPYQUICKVIEW_DECL(18);
+QPYQUICKVIEW_DECL(19);
+
+
+#endif
diff --git a/qpy/QtQuick/qpyquickwindow.cpp b/qpy/QtQuick/qpyquickwindow.cpp
new file mode 100644 (file)
index 0000000..ef3f455
--- /dev/null
@@ -0,0 +1,163 @@
+// This is the implementation of the QPyQuickWindow classes.
+//
+// Copyright (c) 2018 Riverbank Computing Limited <info@riverbankcomputing.com>
+// 
+// This file is part of PyQt5.
+// 
+// This file may be used under the terms of the GNU General Public License
+// version 3.0 as published by the Free Software Foundation and appearing in
+// the file LICENSE included in the packaging of this file.  Please review the
+// following information to ensure the GNU General Public License version 3.0
+// requirements will be met: http://www.gnu.org/copyleft/gpl.html.
+// 
+// If you do not wish to use this file under the terms of the GPL version 3.0
+// then you may purchase a commercial license.  For more information contact
+// info@riverbankcomputing.com.
+// 
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+
+
+#include <Python.h>
+
+#include <QQmlListProperty>
+
+#include "qpyquickwindow.h"
+
+#include "sipAPIQtQuick.h"
+
+
+// The maximum number of Python QQuickWindow types.
+const int NrOfQuickWindowTypes = 20;
+
+// The list of registered Python types.
+static QList<PyTypeObject *> pyqt_types;
+
+// The registration data for the canned types.
+static QQmlPrivate::RegisterType canned_types[NrOfQuickWindowTypes];
+
+// External declarations.
+extern const QMetaObject *qpyquick_pick_metaobject(const QMetaObject *super_mo,
+        const QMetaObject *static_mo);
+
+
+#define QPYQUICKWINDOW_INIT(n) \
+    case n##U: \
+        QPyQuickWindow##n::staticMetaObject = *mo; \
+        rt->typeId = qRegisterNormalizedMetaType<QPyQuickWindow##n *>(ptr_name); \
+        rt->listId = qRegisterNormalizedMetaType<QQmlListProperty<QPyQuickWindow##n> >(list_name); \
+        rt->objectSize = sizeof(QPyQuickWindow##n); \
+        rt->create = QQmlPrivate::createInto<QPyQuickWindow##n>; \
+        rt->metaObject = mo; \
+        rt->attachedPropertiesFunction = QQmlPrivate::attachedPropertiesFunc<QPyQuickWindow##n>(); \
+        rt->attachedPropertiesMetaObject = QQmlPrivate::attachedPropertiesMetaObject<QPyQuickWindow##n>(); \
+        rt->parserStatusCast = QQmlPrivate::StaticCastSelector<QPyQuickWindow##n,QQmlParserStatus>::cast(); \
+        rt->valueSourceCast = QQmlPrivate::StaticCastSelector<QPyQuickWindow##n,QQmlPropertyValueSource>::cast(); \
+        rt->valueInterceptorCast = QQmlPrivate::StaticCastSelector<QPyQuickWindow##n,QQmlPropertyValueInterceptor>::cast(); \
+        break
+
+
+// The ctor.
+QPyQuickWindow::QPyQuickWindow(QWindow *parent) : sipQQuickWindow(parent)
+{
+}
+
+
+// Add a new Python type and return its number.
+QQmlPrivate::RegisterType *QPyQuickWindow::addType(PyTypeObject *type,
+        const QMetaObject *mo, const QByteArray &ptr_name,
+        const QByteArray &list_name)
+{
+    int type_nr = pyqt_types.size();
+
+    // Check we have a spare canned type.
+    if (type_nr >= NrOfQuickWindowTypes)
+    {
+        PyErr_Format(PyExc_TypeError,
+                "a maximum of %d QQuickWindow types may be registered with QML",
+                NrOfQuickWindowTypes);
+        return 0;
+    }
+
+    pyqt_types.append(type);
+
+    QQmlPrivate::RegisterType *rt = &canned_types[type_nr];
+
+    // Initialise those members that depend on the C++ type.
+    switch (type_nr)
+    {
+        QPYQUICKWINDOW_INIT(0);
+        QPYQUICKWINDOW_INIT(1);
+        QPYQUICKWINDOW_INIT(2);
+        QPYQUICKWINDOW_INIT(3);
+        QPYQUICKWINDOW_INIT(4);
+        QPYQUICKWINDOW_INIT(5);
+        QPYQUICKWINDOW_INIT(6);
+        QPYQUICKWINDOW_INIT(7);
+        QPYQUICKWINDOW_INIT(8);
+        QPYQUICKWINDOW_INIT(9);
+        QPYQUICKWINDOW_INIT(10);
+        QPYQUICKWINDOW_INIT(11);
+        QPYQUICKWINDOW_INIT(12);
+        QPYQUICKWINDOW_INIT(13);
+        QPYQUICKWINDOW_INIT(14);
+        QPYQUICKWINDOW_INIT(15);
+        QPYQUICKWINDOW_INIT(16);
+        QPYQUICKWINDOW_INIT(17);
+        QPYQUICKWINDOW_INIT(18);
+        QPYQUICKWINDOW_INIT(19);
+    }
+
+    return rt;
+}
+
+
+// Create the Python instance.
+void QPyQuickWindow::createPyObject(QWindow *parent)
+{
+    SIP_BLOCK_THREADS
+
+    // Assume C++ owns everything.
+    PyObject *obj = sipConvertFromNewPyType(this, pyqt_types.at(typeNr()),
+            NULL, &sipPySelf, "D", parent, sipType_QWindow, NULL);
+
+    if (!obj)
+        pyqt5_qtquick_err_print();
+
+    SIP_UNBLOCK_THREADS
+}
+
+
+// The canned type implementations.
+#define QPYQUICKWINDOW_IMPL(n) \
+QPyQuickWindow##n::QPyQuickWindow##n(QWindow *parent) : QPyQuickWindow(parent) \
+{ \
+    createPyObject(parent); \
+} \
+const QMetaObject *QPyQuickWindow##n::metaObject() const \
+{ \
+    return qpyquick_pick_metaobject(QPyQuickWindow::metaObject(), &staticMetaObject); \
+} \
+QMetaObject QPyQuickWindow##n::staticMetaObject
+
+
+QPYQUICKWINDOW_IMPL(0);
+QPYQUICKWINDOW_IMPL(1);
+QPYQUICKWINDOW_IMPL(2);
+QPYQUICKWINDOW_IMPL(3);
+QPYQUICKWINDOW_IMPL(4);
+QPYQUICKWINDOW_IMPL(5);
+QPYQUICKWINDOW_IMPL(6);
+QPYQUICKWINDOW_IMPL(7);
+QPYQUICKWINDOW_IMPL(8);
+QPYQUICKWINDOW_IMPL(9);
+QPYQUICKWINDOW_IMPL(10);
+QPYQUICKWINDOW_IMPL(11);
+QPYQUICKWINDOW_IMPL(12);
+QPYQUICKWINDOW_IMPL(13);
+QPYQUICKWINDOW_IMPL(14);
+QPYQUICKWINDOW_IMPL(15);
+QPYQUICKWINDOW_IMPL(16);
+QPYQUICKWINDOW_IMPL(17);
+QPYQUICKWINDOW_IMPL(18);
+QPYQUICKWINDOW_IMPL(19);
diff --git a/qpy/QtQuick/qpyquickwindow.h b/qpy/QtQuick/qpyquickwindow.h
new file mode 100644 (file)
index 0000000..97ad80c
--- /dev/null
@@ -0,0 +1,88 @@
+// This is the definition of the QPyQuickWindow classes.
+//
+// Copyright (c) 2018 Riverbank Computing Limited <info@riverbankcomputing.com>
+// 
+// This file is part of PyQt5.
+// 
+// This file may be used under the terms of the GNU General Public License
+// version 3.0 as published by the Free Software Foundation and appearing in
+// the file LICENSE included in the packaging of this file.  Please review the
+// following information to ensure the GNU General Public License version 3.0
+// requirements will be met: http://www.gnu.org/copyleft/gpl.html.
+// 
+// If you do not wish to use this file under the terms of the GPL version 3.0
+// then you may purchase a commercial license.  For more information contact
+// info@riverbankcomputing.com.
+// 
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+
+
+#ifndef _QPYQUICKWINDOW_H
+#define _QPYQUICKWINDOW_H
+
+
+#include <Python.h>
+
+#include <qqmlprivate.h>
+#include <QByteArray>
+#include <QMetaObject>
+#include <QQuickWindow>
+
+#include "sipAPIQtQuick.h"
+
+
+class QPyQuickWindow : public sipQQuickWindow
+{
+public:
+    QPyQuickWindow(QWindow *parent = 0);
+
+    virtual int typeNr() const = 0;
+
+    static QQmlPrivate::RegisterType *addType(PyTypeObject *type,
+            const QMetaObject *mo, const QByteArray &ptr_name,
+            const QByteArray &list_name);
+    void createPyObject(QWindow *parent);
+
+private:
+    QPyQuickWindow(const QPyQuickWindow &);
+};
+
+
+// The canned type declarations.
+#define QPYQUICKWINDOW_DECL(n) \
+class QPyQuickWindow##n : public QPyQuickWindow \
+{ \
+public: \
+    QPyQuickWindow##n(QWindow *parent = 0); \
+    static QMetaObject staticMetaObject; \
+    virtual const QMetaObject *metaObject() const; \
+    virtual int typeNr() const {return n##U;} \
+private: \
+    QPyQuickWindow##n(const QPyQuickWindow##n &); \
+}
+
+
+QPYQUICKWINDOW_DECL(0);
+QPYQUICKWINDOW_DECL(1);
+QPYQUICKWINDOW_DECL(2);
+QPYQUICKWINDOW_DECL(3);
+QPYQUICKWINDOW_DECL(4);
+QPYQUICKWINDOW_DECL(5);
+QPYQUICKWINDOW_DECL(6);
+QPYQUICKWINDOW_DECL(7);
+QPYQUICKWINDOW_DECL(8);
+QPYQUICKWINDOW_DECL(9);
+QPYQUICKWINDOW_DECL(10);
+QPYQUICKWINDOW_DECL(11);
+QPYQUICKWINDOW_DECL(12);
+QPYQUICKWINDOW_DECL(13);
+QPYQUICKWINDOW_DECL(14);
+QPYQUICKWINDOW_DECL(15);
+QPYQUICKWINDOW_DECL(16);
+QPYQUICKWINDOW_DECL(17);
+QPYQUICKWINDOW_DECL(18);
+QPYQUICKWINDOW_DECL(19);
+
+
+#endif
index f2121773cb7a2832cf4ae63fa6d00c93aa634464..91e175296df57dd983f13dd6b9cbbbad3912877a 100644 (file)
@@ -20,7 +20,7 @@
 // WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 
 
-class QQuickView : QQuickWindow
+class QQuickView : QQuickWindow /ExportDerived/
 {
 %TypeHeaderCode
 #include <qquickview.h>
index b81c8620a4d976b338fb0e02b1ec0d9acacfc12f..6706636be25c0e84e728d1ea3080290600a2fcf0 100644 (file)
@@ -20,7 +20,7 @@
 // WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 
 
-class QQuickWindow : QWindow
+class QQuickWindow : QWindow /ExportDerived/
 {
 %TypeHeaderCode
 #include <qquickwindow.h>