From 1e350a8c98d9c98823dde83a6745d2f26a9c0785 Mon Sep 17 00:00:00 2001 From: Mitch Curtis Date: Wed, 24 Jan 2018 17:23:03 +0100 Subject: Disallow registration of types beginning with lowercase letters Allowing types with lowercase names causes ambiguity, as can be seen in QTBUG-43567 and the comment in IRBuilder::visit(), which explains that "the grammar can't distinguish between two different definitions" whose only difference is casing of the first letter. - Prevent registration (return -1 with e.g. qmlRegisterType()) when a type name doesn't begin with an uppercase letter. - Document the uppercase type name rule in more places. Change-Id: I4e522c65990f418eaafa45a256e3cb07a3e01ba4 Reviewed-by: Shawn Rutledge --- src/qml/doc/src/qmllanguageref/syntax/basics.qdoc | 2 ++ src/qml/doc/src/qmllanguageref/typesystem/objecttypes.qdoc | 2 ++ 2 files changed, 4 insertions(+) (limited to 'src/qml/doc/src') diff --git a/src/qml/doc/src/qmllanguageref/syntax/basics.qdoc b/src/qml/doc/src/qmllanguageref/syntax/basics.qdoc index 1b645a94c0..9eb8f72cf2 100644 --- a/src/qml/doc/src/qmllanguageref/syntax/basics.qdoc +++ b/src/qml/doc/src/qmllanguageref/syntax/basics.qdoc @@ -38,6 +38,8 @@ imperative code, in the case where complex custom application behavior is needed QML source code is generally loaded by the engine through QML \e documents, which are standalone documents of QML code. These can be used to define \l {QML Object Types}{QML object types} that can then be reused throughout an application. +Note that type names must begin with an uppercase letter in order +to be declared as QML object types in a QML file. \section1 Import Statements diff --git a/src/qml/doc/src/qmllanguageref/typesystem/objecttypes.qdoc b/src/qml/doc/src/qmllanguageref/typesystem/objecttypes.qdoc index b74646b7d0..5f089b5ebc 100644 --- a/src/qml/doc/src/qmllanguageref/typesystem/objecttypes.qdoc +++ b/src/qml/doc/src/qmllanguageref/typesystem/objecttypes.qdoc @@ -45,6 +45,8 @@ type, as discussed in \l {qtqml-documents-definetypes.html} {Documents as QML object type definitions}, or by defining a QML type from C++ and registering the type with the QML engine, as discussed in \l{qtqml-cppintegration-definetypes.html}{Defining QML Types from C++}. +Note that in both cases, the type name must begin with an uppercase letter in +order to be declared as a QML object type in a QML file. \section1 Defining Object Types from QML -- cgit v1.2.3 From 6958308c09ceda855a30c5a2d491f078c5104071 Mon Sep 17 00:00:00 2001 From: J-P Nurmi Date: Mon, 29 Jan 2018 16:58:22 +0100 Subject: Doc: add C++11 lambda examples for qmlRegisterSingletonType() Change-Id: I444137fd10041781df232447b8e2bf712582f079 Reviewed-by: Mitch Curtis Reviewed-by: Shawn Rutledge --- src/qml/doc/src/qmlfunctions.qdoc | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'src/qml/doc/src') diff --git a/src/qml/doc/src/qmlfunctions.qdoc b/src/qml/doc/src/qmlfunctions.qdoc index 8a62a18eec..f939ddbcf3 100644 --- a/src/qml/doc/src/qmlfunctions.qdoc +++ b/src/qml/doc/src/qmlfunctions.qdoc @@ -324,6 +324,19 @@ qmlRegisterSingletonType("Qt.example.qjsvalueApi", 1, 0, "MyApi", example_qjsvalue_singletontype_provider); \endcode + Alternatively, you can use a C++11 lambda: + + \code + qmlRegisterSingletonType("Qt.example.qjsvalueApi", 1, 0, "MyApi", [](QQmlEngine *engine, QJSEngine *scriptEngine) -> QJSValue { + Q_UNUSED(engine) + + static int seedValue = 5; + QJSValue example = scriptEngine->newObject(); + example.setProperty("someProperty", seedValue++); + return example; + }); + \endcode + In order to use the registered singleton type in QML, you must import the singleton type. \qml import QtQuick 2.0 @@ -423,6 +436,18 @@ qmlRegisterSingletonType("Qt.example.qobjectSingleton", 1, 0, "MyApi", example_qobject_singletontype_provider); \endcode + Alternatively, you can use a C++11 lambda: + + \code + qmlRegisterSingletonType("Qt.example.qjsvalueApi", 1, 0, "MyApi", [](QQmlEngine *engine, QJSEngine *scriptEngine) -> QObject * { + Q_UNUSED(engine) + Q_UNUSED(scriptEngine) + + SingletonTypeExample *example = new SingletonTypeExample(); + return example; + }); + \endcode + In order to use the registered singleton type in QML, you must import the singleton type. \qml import QtQuick 2.0 -- cgit v1.2.3