diff options
author | BogDan Vatra <bogdan@kdab.com> | 2016-09-04 11:27:18 +0300 |
---|---|---|
committer | BogDan Vatra <bogdan@kdab.com> | 2016-09-07 05:03:26 +0000 |
commit | cd77297bd97bdd70d9526fb9c54ebcca8c081def (patch) | |
tree | 9dea80e5f0dc50d30c3a060c33bbedc5f6193c12 | |
parent | 9c8fc476c68767895a2c4086cb7f5b99c5fa141f (diff) |
Add qmlRegisterUncreatableMetaObject convenience function
qmlRegisterUncreatableMetaObject is needed to register Q_NAMESPACE
QMetaObjects.
Task-number: QTBUG-54982
Change-Id: I767dfcb15db647e0dceb0c37b17e64f2a5c1dd8f
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
-rw-r--r-- | src/qml/doc/src/qmlfunctions.qdoc | 36 | ||||
-rw-r--r-- | src/qml/qml/qqml.h | 3 | ||||
-rw-r--r-- | src/qml/qml/qqmlengine.cpp | 33 | ||||
-rw-r--r-- | tests/auto/qml/qqmllanguage/data/cppnamespace.qml | 1 | ||||
-rw-r--r-- | tests/auto/qml/qqmllanguage/testtypes.cpp | 1 | ||||
-rw-r--r-- | tests/auto/qml/qqmllanguage/testtypes.h | 10 |
6 files changed, 84 insertions, 0 deletions
diff --git a/src/qml/doc/src/qmlfunctions.qdoc b/src/qml/doc/src/qmlfunctions.qdoc index 26fc40ff37..8b24d19891 100644 --- a/src/qml/doc/src/qmlfunctions.qdoc +++ b/src/qml/doc/src/qmlfunctions.qdoc @@ -180,6 +180,42 @@ */ /*! + \fn static inline int qmlRegisterUncreatableMetaObject(const QMetaObject &staticMetaObject, const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString& reason) + \relates QQmlEngine + \since 5.8 + + This function registers the \a staticMetaObject and its extension + in the QML system with the name \a qmlName in the library imported + from \a uri having version number composed from \a versionMajor and + \a versionMinor. + + This function is useful to register Q_NAMESPACE namespaces. + + Returns the QML type id. + + Example: + + \code + namespace MyNamespace { + Q_NAMESPACE + enum MyEnum { + Key1, + Key2, + }; + Q_ENUMS(MyEnum) + } + + //... + qmlRegisterUncreatableMetaObject(MyNamespace::staticMetaObject, "io.qt", 1, 0, "MyNamespace", "Access to enums & flags only"); + \endcode + + Now on QML side you can use the registered enums: + \code + Component.onCompleted: console.log(MyNamespace.Key2) + \endcode +*/ + +/*! \fn int qmlRegisterCustomExtendedType(const char *uri, int versionMajor, int versionMinor, const char *qmlName, QQmlCustomParser *parser) \relates QQmlEngine \internal diff --git a/src/qml/qml/qqml.h b/src/qml/qml/qqml.h index 8fb710ad9d..39764b8001 100644 --- a/src/qml/qml/qqml.h +++ b/src/qml/qml/qqml.h @@ -238,6 +238,9 @@ int qmlRegisterExtendedUncreatableType(const char *uri, int versionMajor, int ve return QQmlPrivate::qmlregister(QQmlPrivate::TypeRegistration, &type); } + +Q_QML_EXPORT int qmlRegisterUncreatableMetaObject(const QMetaObject &staticMetaObject, const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString& reason); + template<typename T> int qmlRegisterType(const char *uri, int versionMajor, int versionMinor, const char *qmlName) { diff --git a/src/qml/qml/qqmlengine.cpp b/src/qml/qml/qqmlengine.cpp index 7e4fe73ba1..cb51c18925 100644 --- a/src/qml/qml/qqmlengine.cpp +++ b/src/qml/qml/qqmlengine.cpp @@ -116,6 +116,39 @@ void qmlRegisterBaseTypes(const char *uri, int versionMajor, int versionMinor) QQmlValueTypeFactory::registerValueTypes(uri, versionMajor, versionMinor); } +// Declared in qqml.h +int qmlRegisterUncreatableMetaObject(const QMetaObject &staticMetaObject, + const char *uri, int versionMajor, + int versionMinor, const char *qmlName, + const QString& reason) +{ + QQmlPrivate::RegisterType type = { + 0, + + 0, + 0, + 0, + Q_NULLPTR, + reason, + + uri, versionMajor, versionMinor, qmlName, &staticMetaObject, + + QQmlAttachedPropertiesFunc(), + Q_NULLPTR, + + 0, + 0, + 0, + + Q_NULLPTR, Q_NULLPTR, + + Q_NULLPTR, + 0 + }; + + return QQmlPrivate::qmlregister(QQmlPrivate::TypeRegistration, &type); +} + /*! \qmltype QtObject \instantiates QObject diff --git a/tests/auto/qml/qqmllanguage/data/cppnamespace.qml b/tests/auto/qml/qqmllanguage/data/cppnamespace.qml index e1daf3b78f..efedf2b14a 100644 --- a/tests/auto/qml/qqmllanguage/data/cppnamespace.qml +++ b/tests/auto/qml/qqmllanguage/data/cppnamespace.qml @@ -1,4 +1,5 @@ import Test 1.0 MyNamespacedType { + myEnum: MyNamespace.Key5 } diff --git a/tests/auto/qml/qqmllanguage/testtypes.cpp b/tests/auto/qml/qqmllanguage/testtypes.cpp index 3921f89d23..3af7645ff7 100644 --- a/tests/auto/qml/qqmllanguage/testtypes.cpp +++ b/tests/auto/qml/qqmllanguage/testtypes.cpp @@ -45,6 +45,7 @@ void registerTypes() qmlRegisterType<MyDotPropertyObject>("Test",1,0,"MyDotPropertyObject"); qmlRegisterType<MyNamespace::MyNamespacedType>("Test",1,0,"MyNamespacedType"); qmlRegisterType<MyNamespace::MySecondNamespacedType>("Test",1,0,"MySecondNamespacedType"); + qmlRegisterUncreatableMetaObject(MyNamespace::staticMetaObject, "Test", 1, 0, "MyNamespace", "Access to enums & flags only"); qmlRegisterType<MyParserStatus>("Test",1,0,"MyParserStatus"); qmlRegisterType<MyGroupedObject>(); qmlRegisterType<MyRevisionedClass>("Test",1,0,"MyRevisionedClass"); diff --git a/tests/auto/qml/qqmllanguage/testtypes.h b/tests/auto/qml/qqmllanguage/testtypes.h index af7dc155d0..6c62bcf7b9 100644 --- a/tests/auto/qml/qqmllanguage/testtypes.h +++ b/tests/auto/qml/qqmllanguage/testtypes.h @@ -730,9 +730,19 @@ private: namespace MyNamespace { + Q_NAMESPACE + enum MyNSEnum { + Key1 = 1, + Key2, + Key5 = 5 + }; + Q_ENUM_NS(MyNSEnum); + class MyNamespacedType : public QObject { Q_OBJECT + Q_PROPERTY(MyNamespace::MyNSEnum myEnum MEMBER m_myEnum) + MyNamespace::MyNSEnum m_myEnum = MyNSEnum::Key1; }; class MySecondNamespacedType : public QObject |