diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2019-01-08 13:32:41 +0100 |
---|---|---|
committer | Maximilian Goldstein <max.goldstein@qt.io> | 2020-07-24 08:30:52 +0000 |
commit | cc91eb893e53ea2516d895bd1861c1159d5a5c90 (patch) | |
tree | 5c9611f52052050671ec72ff6be1d906114a7840 | |
parent | 9c6e82e2857e4ce45c578b73807de4b3b941ab38 (diff) |
PySide2: Add qmlRegisterUncreatableType()
Extend the Quick register helper function by the bool creatable and
string noCreationReason parameters, extract a QML helper taking the same
parameters and add the overload.
Task-number: PYSIDE-574
Change-Id: I955dbd158c7b22d2637bbac464937f9fda6d7901
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
-rw-r--r-- | sources/pyside2/PySide2/QtQml/pysideqmlregistertype.cpp | 11 | ||||
-rw-r--r-- | sources/pyside2/PySide2/QtQml/pysideqmlregistertype.h | 2 | ||||
-rw-r--r-- | sources/pyside2/PySide2/QtQml/typesystem_qml.xml | 4 | ||||
-rw-r--r-- | sources/pyside2/PySide2/QtQuick/pysidequickregistertype.cpp | 5 | ||||
-rw-r--r-- | sources/pyside2/PySide2/glue/qtqml.cpp | 5 | ||||
-rw-r--r-- | sources/pyside2/libpyside/pyside.h | 9 | ||||
-rw-r--r-- | sources/pyside2/tests/QtQml/registertype.py | 36 | ||||
-rw-r--r-- | sources/pyside2/tests/QtQml/registeruncreatable.qml | 43 |
8 files changed, 100 insertions, 15 deletions
diff --git a/sources/pyside2/PySide2/QtQml/pysideqmlregistertype.cpp b/sources/pyside2/PySide2/QtQml/pysideqmlregistertype.cpp index 2381b3e73..ebc549543 100644 --- a/sources/pyside2/PySide2/QtQml/pysideqmlregistertype.cpp +++ b/sources/pyside2/PySide2/QtQml/pysideqmlregistertype.cpp @@ -73,7 +73,8 @@ static void createInto(void *memory, void *type) } int PySide::qmlRegisterType(PyObject *pyObj, const char *uri, int versionMajor, - int versionMinor, const char *qmlName) + int versionMinor, const char *qmlName, const char *noCreationReason, + bool creatable) { using namespace Shiboken; @@ -97,8 +98,9 @@ int PySide::qmlRegisterType(PyObject *pyObj, const char *uri, int versionMajor, #ifdef PYSIDE_QML_SUPPORT QuickRegisterItemFunction quickRegisterItemFunction = getQuickRegisterItemFunction(); if (quickRegisterItemFunction) { - registered = quickRegisterItemFunction(pyObj, uri, versionMajor, versionMinor, - qmlName, &type); + registered = + quickRegisterItemFunction(pyObj, uri, versionMajor, versionMinor, + qmlName, creatable, noCreationReason, &type); } #endif @@ -126,7 +128,8 @@ int PySide::qmlRegisterType(PyObject *pyObj, const char *uri, int versionMajor, int objectSize = static_cast<int>(PySide::getSizeOfQObject( reinterpret_cast<SbkObjectType *>(pyObj))); type.objectSize = objectSize; - type.create = createInto; + type.create = creatable ? createInto : nullptr; + type.noCreationReason = noCreationReason; type.userdata = pyObj; type.uri = uri; type.version = QTypeRevision::fromVersion(versionMajor, versionMinor); diff --git a/sources/pyside2/PySide2/QtQml/pysideqmlregistertype.h b/sources/pyside2/PySide2/QtQml/pysideqmlregistertype.h index 52ef92608..8ea332f04 100644 --- a/sources/pyside2/PySide2/QtQml/pysideqmlregistertype.h +++ b/sources/pyside2/PySide2/QtQml/pysideqmlregistertype.h @@ -70,7 +70,7 @@ void initQmlSupport(PyObject *module); * \return the metatype id of the registered type. */ int qmlRegisterType(PyObject *pyObj, const char *uri, int versionMajor, int versionMinor, - const char *qmlName); + const char *qmlName, const char *noCreationReason = nullptr, bool creatable = true); /** * PySide implementation of qmlRegisterType<T> function. diff --git a/sources/pyside2/PySide2/QtQml/typesystem_qml.xml b/sources/pyside2/PySide2/QtQml/typesystem_qml.xml index 1b3dade86..79578e2c4 100644 --- a/sources/pyside2/PySide2/QtQml/typesystem_qml.xml +++ b/sources/pyside2/PySide2/QtQml/typesystem_qml.xml @@ -111,6 +111,10 @@ <inject-code class="target" file="../glue/qtqml.cpp" snippet="qmlregistersingletontype_qjsvalue"/> </add-function> + <add-function signature="qmlRegisterUncreatableType(PyTypeObject,const char*,int,int,const char*,const char*)" return-type="int"> + <inject-code class="target" file="../glue/qtqml.cpp" snippet="qmlregisteruncreatabletype"/> + </add-function> + <enum-type identified-by-value="QML_HAS_ATTACHED_PROPERTIES"> <extra-includes> <include file-name="QtQml" location="global"/> diff --git a/sources/pyside2/PySide2/QtQuick/pysidequickregistertype.cpp b/sources/pyside2/PySide2/QtQuick/pysidequickregistertype.cpp index 581a97dec..dc4645487 100644 --- a/sources/pyside2/PySide2/QtQuick/pysidequickregistertype.cpp +++ b/sources/pyside2/PySide2/QtQuick/pysidequickregistertype.cpp @@ -145,7 +145,7 @@ void registerTypeIfInheritsFromClass( } bool quickRegisterType(PyObject *pyObj, const char *uri, int versionMajor, int versionMinor, - const char *qmlName, QQmlPrivate::RegisterType *type) + const char *qmlName, bool creatable, const char *noCreationReason, QQmlPrivate::RegisterType *type) { using namespace Shiboken; @@ -186,7 +186,8 @@ bool quickRegisterType(PyObject *pyObj, const char *uri, int versionMajor, int v return false; type->structVersion = 0; - type->create = createQuickItem; + type->create = creatable ? createQuickItem : nullptr; + type->noCreationReason = noCreationReason; type->userdata = pyObj; type->uri = uri; type->version = QTypeRevision::fromVersion(versionMajor, versionMinor); diff --git a/sources/pyside2/PySide2/glue/qtqml.cpp b/sources/pyside2/PySide2/glue/qtqml.cpp index b1d043cf8..5ff072e09 100644 --- a/sources/pyside2/PySide2/glue/qtqml.cpp +++ b/sources/pyside2/PySide2/glue/qtqml.cpp @@ -57,6 +57,11 @@ int %0 = PySide::qmlRegisterSingletonType(nullptr, %ARGUMENT_NAMES, false, true) %PYARG_0 = %CONVERTTOPYTHON[int](%0); // @snippet qmlregistersingletontype_qjsvalue +// @snippet qmlregisteruncreatabletype +int %0 = PySide::qmlRegisterType(%ARGUMENT_NAMES, false); +%PYARG_0 = %CONVERTTOPYTHON[int](%0); +// @snippet qmlregisteruncreatabletype + // @snippet init PySide::initQmlSupport(module); // @snippet init diff --git a/sources/pyside2/libpyside/pyside.h b/sources/pyside2/libpyside/pyside.h index c1a298cc8..e241ac74d 100644 --- a/sources/pyside2/libpyside/pyside.h +++ b/sources/pyside2/libpyside/pyside.h @@ -144,9 +144,11 @@ PYSIDE_API PyObject *getWrapperForQObject(QObject *cppSelf, SbkObjectType *sbk_t #ifdef PYSIDE_QML_SUPPORT // Used by QtQuick module to notify QtQml that custom QtQuick items can be registered. -typedef bool (*QuickRegisterItemFunction)(PyObject *pyObj, const char *uri, int versionMajor, - int versionMinor, const char *qmlName, - QQmlPrivate::RegisterType *); +using QuickRegisterItemFunction = + bool (*)(PyObject *pyObj, const char *uri, int versionMajor, + int versionMinor, const char *qmlName, + bool creatable, const char *noCreationReason, + QQmlPrivate::RegisterType *); PYSIDE_API QuickRegisterItemFunction getQuickRegisterItemFunction(); PYSIDE_API void setQuickRegisterItemFunction(QuickRegisterItemFunction function); #endif // PYSIDE_QML_SUPPORT @@ -169,4 +171,3 @@ PYSIDE_API bool registerInternalQtConf(); #endif // PYSIDE_H - diff --git a/sources/pyside2/tests/QtQml/registertype.py b/sources/pyside2/tests/QtQml/registertype.py index 7e6fe8d29..53425b1b6 100644 --- a/sources/pyside2/tests/QtQml/registertype.py +++ b/sources/pyside2/tests/QtQml/registertype.py @@ -36,11 +36,26 @@ init_test_paths(False) from helper.helper import adjust_filename -from PySide2.QtCore import Property, QTimer, QUrl +from PySide2.QtCore import Property, QObject, QTimer, QUrl from PySide2.QtGui import QGuiApplication, QPen, QColor, QPainter -from PySide2.QtQml import qmlRegisterType, ListProperty +from PySide2.QtQml import qmlRegisterType, qmlRegisterUncreatableType, ListProperty from PySide2.QtQuick import QQuickView, QQuickItem, QQuickPaintedItem +noCreationReason = 'Cannot create an item of type: Uncreatable (expected)'; + +class Uncreatable(QObject): + def __init__(self, parent = None): + QObject.__init__(self, parent) + self._name = 'uncreatable' + + def getName(self): + return self._name + + def setName(self, value): + self._name = value + + name = Property(str, getName, setName) + class PieSlice (QQuickPaintedItem): def __init__(self, parent = None): QQuickPaintedItem.__init__(self, parent) @@ -108,8 +123,10 @@ class TestQmlSupport(unittest.TestCase): def testIt(self): app = QGuiApplication([]) - qmlRegisterType(PieChart, 'Charts', 1, 0, 'PieChart'); - qmlRegisterType(PieSlice, "Charts", 1, 0, "PieSlice"); + qmlRegisterType(PieChart, 'Charts', 1, 0, 'PieChart') + self.assertTrue(qmlRegisterType(PieSlice, "Charts", 1, 0, "PieSlice") > 0); + self.assertTrue(qmlRegisterUncreatableType(Uncreatable, 'Charts', 1, 0, + 'Uncreatable', noCreationReason) > 0); view = QQuickView() view.setSource(QUrl.fromLocalFile(adjust_filename('registertype.qml', __file__))) @@ -119,5 +136,16 @@ class TestQmlSupport(unittest.TestCase): self.assertTrue(appendCalled) self.assertTrue(paintCalled) + # Check that the uncreatable item produces the correct error + view.setSource(QUrl.fromLocalFile(helper.adjust_filename('registeruncreatable.qml', __file__))) + self.assertEqual(view.status(), QQuickView.Error) + errorFound = False + for e in view.errors(): + if noCreationReason in e.toString(): + errorFound = True + break + self.assertTrue(errorFound) + + if __name__ == '__main__': unittest.main() diff --git a/sources/pyside2/tests/QtQml/registeruncreatable.qml b/sources/pyside2/tests/QtQml/registeruncreatable.qml new file mode 100644 index 000000000..347a8117a --- /dev/null +++ b/sources/pyside2/tests/QtQml/registeruncreatable.qml @@ -0,0 +1,43 @@ +/**************************************************************************** +** +** Copyright (C) 2020 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the test suite of Qt for Python. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 +import Charts 1.0 + +Item { + width: 300; height: 200 + + Uncreatable { + name : 'uncreatable' + } + + PieChart { + anchors.centerIn: parent + width: 100; height: 100 + } +} |