Add unit test and documentation for module API
Related to commit ae6c7a44394d4a5f943f1fc92f4de015ec7bcc96. Previously, only property access on module API was tested. This commit adds a test which calls a method on a module API. It also adds documentation for the qmlRegisterModuleApi functions. Task-number: QMLNG-33 Reviewed-by: Martin Jones
This commit is contained in:
parent
e50b7c9299
commit
24bb6f90f8
|
@ -410,6 +410,46 @@ QObject *qmlAttachedPropertiesObject(const QObject *obj, bool create = true)
|
||||||
return qmlAttachedPropertiesObject(&idx, obj, &T::staticMetaObject, create);
|
return qmlAttachedPropertiesObject(&idx, obj, &T::staticMetaObject, create);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
This function may be used to register a module API provider \a callback in a particular \a uri
|
||||||
|
with a version specified in \a versionMajor and \a versionMinor.
|
||||||
|
|
||||||
|
Installing a module API into a uri allows developers to provide arbitrary functionality
|
||||||
|
(methods and properties) in a namespace that doesn't necessarily contain elements.
|
||||||
|
|
||||||
|
A module API may be either a QObject or a QScriptValue. Only one module API provider
|
||||||
|
may be registered into any given namespace (combination of \a uri, \a majorVersion and \a minorVersion).
|
||||||
|
This function should be used to register a module API provider function which returns a QScriptValue as a module API.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
\code
|
||||||
|
// first, define the module API provider function (callback).
|
||||||
|
static QScriptValue *example_qscriptvalue_module_api_provider(QDeclarativeEngine *engine, QScriptEngine *scriptEngine)
|
||||||
|
{
|
||||||
|
Q_UNUSED(engine)
|
||||||
|
|
||||||
|
static int seedValue = 5;
|
||||||
|
QScriptValue example = scriptEngine->newObject();
|
||||||
|
example.setProperty("someProperty", seedValue++);
|
||||||
|
return example;
|
||||||
|
}
|
||||||
|
|
||||||
|
// second, register the module API provider with QML by calling this function in an initialization function.
|
||||||
|
...
|
||||||
|
qmlRegisterModuleApi("Qt.example.qscriptvalueApi", 1, 0, example_qscriptvalue_module_api_provider);
|
||||||
|
...
|
||||||
|
\endcode
|
||||||
|
|
||||||
|
In order to use the registered module API in QML, you must import the module API.
|
||||||
|
\qml
|
||||||
|
import QtQuick 2.0
|
||||||
|
import Qt.example.qscriptvalueApi 1.0 as ExampleApi
|
||||||
|
Item {
|
||||||
|
id: root
|
||||||
|
property int someValue: ExampleApi.someProperty
|
||||||
|
}
|
||||||
|
\endqml
|
||||||
|
*/
|
||||||
inline int qmlRegisterModuleApi(const char *uri, int versionMajor, int versionMinor,
|
inline int qmlRegisterModuleApi(const char *uri, int versionMajor, int versionMinor,
|
||||||
QScriptValue (*callback)(QDeclarativeEngine *, QScriptEngine *))
|
QScriptValue (*callback)(QDeclarativeEngine *, QScriptEngine *))
|
||||||
{
|
{
|
||||||
|
@ -424,6 +464,75 @@ inline int qmlRegisterModuleApi(const char *uri, int versionMajor, int versionMi
|
||||||
return QDeclarativePrivate::qmlregister(QDeclarativePrivate::ModuleApiRegistration, &api);
|
return QDeclarativePrivate::qmlregister(QDeclarativePrivate::ModuleApiRegistration, &api);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
This function may be used to register a module API provider \a callback in a particular \a uri
|
||||||
|
with a version specified in \a versionMajor and \a versionMinor.
|
||||||
|
|
||||||
|
Installing a module API into a uri allows developers to provide arbitrary functionality
|
||||||
|
(methods and properties) in a namespace that doesn't necessarily contain elements.
|
||||||
|
|
||||||
|
A module API may be either a QObject or a QScriptValue. Only one module API provider
|
||||||
|
may be registered into any given namespace (combination of \a uri, \a majorVersion and \a minorVersion).
|
||||||
|
This function should be used to register a module API provider function which returns a QObject as a module API.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
\code
|
||||||
|
// first, define your QObject which provides the functionality.
|
||||||
|
class ModuleApiExample : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
Q_PROPERTY (int someProperty READ someProperty WRITE setSomeProperty NOTIFY somePropertyChanged)
|
||||||
|
|
||||||
|
public:
|
||||||
|
ModuleApiExample(QObject* parent = 0)
|
||||||
|
: QObject(parent), m_someProperty(0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
~ModuleApiExample() {}
|
||||||
|
|
||||||
|
Q_INVOKABLE int doSomething() { setSomeProperty(5); return m_someProperty; }
|
||||||
|
|
||||||
|
int someProperty() const { return m_someProperty; }
|
||||||
|
void setSomeProperty(int val) { m_someProperty = val; emit somePropertyChanged(val); }
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void somePropertyChanged(int newValue);
|
||||||
|
|
||||||
|
private:
|
||||||
|
int m_someProperty;
|
||||||
|
};
|
||||||
|
|
||||||
|
// second, define the module API provider function (callback).
|
||||||
|
static QObject *example_qobject_module_api_provider(QDeclarativeEngine *engine, QScriptEngine *scriptEngine)
|
||||||
|
{
|
||||||
|
Q_UNUSED(engine)
|
||||||
|
Q_UNUSED(scriptEngine)
|
||||||
|
|
||||||
|
ModuleApiExample *example = new ModuleApiExample();
|
||||||
|
return example;
|
||||||
|
}
|
||||||
|
|
||||||
|
// third, register the module API provider with QML by calling this function in an initialization function.
|
||||||
|
...
|
||||||
|
qmlRegisterModuleApi("Qt.example.qobjectApi", 1, 0, example_qobject_module_api_provider);
|
||||||
|
...
|
||||||
|
\endcode
|
||||||
|
|
||||||
|
In order to use the registered module API in QML, you must import the module API.
|
||||||
|
\qml
|
||||||
|
import QtQuick 2.0
|
||||||
|
import Qt.example.qobjectApi 1.0 as ExampleApi
|
||||||
|
Item {
|
||||||
|
id: root
|
||||||
|
property int someValue: ExampleApi.someProperty
|
||||||
|
|
||||||
|
Component.onCompleted: {
|
||||||
|
someValue = ExampleApi.doSomething()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
\endqml
|
||||||
|
*/
|
||||||
inline int qmlRegisterModuleApi(const char *uri, int versionMajor, int versionMinor,
|
inline int qmlRegisterModuleApi(const char *uri, int versionMajor, int versionMinor,
|
||||||
QObject *(*callback)(QDeclarativeEngine *, QScriptEngine *))
|
QObject *(*callback)(QDeclarativeEngine *, QScriptEngine *))
|
||||||
{
|
{
|
||||||
|
|
|
@ -11,8 +11,13 @@ QtObject {
|
||||||
property int existingUriTest: QtTest.qobjectTestProperty
|
property int existingUriTest: QtTest.qobjectTestProperty
|
||||||
property int scriptTest: QtTestScriptApi.scriptTestProperty
|
property int scriptTest: QtTestScriptApi.scriptTestProperty
|
||||||
property int qobjectTest: QtTestQObjectApi.qobjectTestProperty
|
property int qobjectTest: QtTestQObjectApi.qobjectTestProperty
|
||||||
|
property int qobjectMethodTest: 2
|
||||||
property int qobjectMinorVersionTest: QtTestMinorVersionQObjectApi.qobjectTestProperty
|
property int qobjectMinorVersionTest: QtTestMinorVersionQObjectApi.qobjectTestProperty
|
||||||
property int qobjectMajorVersionTest: QtTestMajorVersionQObjectApi.qobjectTestProperty
|
property int qobjectMajorVersionTest: QtTestMajorVersionQObjectApi.qobjectTestProperty
|
||||||
property int qobjectParentedTest: QtTestParentedQObjectApi.qobjectTestProperty
|
property int qobjectParentedTest: QtTestParentedQObjectApi.qobjectTestProperty
|
||||||
|
|
||||||
|
Component.onCompleted: {
|
||||||
|
qobjectMethodTest = QtTestQObjectApi.qobjectTestMethod();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -104,7 +104,6 @@ public:
|
||||||
static QScriptValue script_api(QDeclarativeEngine *engine, QScriptEngine *scriptEngine)
|
static QScriptValue script_api(QDeclarativeEngine *engine, QScriptEngine *scriptEngine)
|
||||||
{
|
{
|
||||||
Q_UNUSED(engine)
|
Q_UNUSED(engine)
|
||||||
Q_UNUSED(scriptEngine)
|
|
||||||
|
|
||||||
static int testProperty = 13;
|
static int testProperty = 13;
|
||||||
QScriptValue v = scriptEngine->newObject();
|
QScriptValue v = scriptEngine->newObject();
|
||||||
|
|
|
@ -939,12 +939,14 @@ class testQObjectApi : public QObject
|
||||||
|
|
||||||
public:
|
public:
|
||||||
testQObjectApi(QObject* parent = 0)
|
testQObjectApi(QObject* parent = 0)
|
||||||
: QObject(parent), m_testProperty(0)
|
: QObject(parent), m_testProperty(0), m_testWritableProperty(0), m_methodCallCount(0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
~testQObjectApi() {}
|
~testQObjectApi() {}
|
||||||
|
|
||||||
|
Q_INVOKABLE int qobjectTestMethod() { m_methodCallCount += 1; return m_methodCallCount; }
|
||||||
|
|
||||||
int qobjectTestProperty() const { return m_testProperty; }
|
int qobjectTestProperty() const { return m_testProperty; }
|
||||||
void setQObjectTestProperty(int tp) { m_testProperty = tp; emit qobjectTestPropertyChanged(tp); }
|
void setQObjectTestProperty(int tp) { m_testProperty = tp; emit qobjectTestPropertyChanged(tp); }
|
||||||
|
|
||||||
|
@ -958,6 +960,7 @@ signals:
|
||||||
private:
|
private:
|
||||||
int m_testProperty;
|
int m_testProperty;
|
||||||
int m_testWritableProperty;
|
int m_testWritableProperty;
|
||||||
|
int m_methodCallCount;
|
||||||
};
|
};
|
||||||
|
|
||||||
void registerTypes();
|
void registerTypes();
|
||||||
|
|
|
@ -2509,6 +2509,7 @@ void tst_qdeclarativeecmascript::moduleApi()
|
||||||
QCOMPARE(object->property("existingUriTest").toInt(), 20);
|
QCOMPARE(object->property("existingUriTest").toInt(), 20);
|
||||||
QCOMPARE(object->property("scriptTest").toInt(), 13);
|
QCOMPARE(object->property("scriptTest").toInt(), 13);
|
||||||
QCOMPARE(object->property("qobjectTest").toInt(), 20);
|
QCOMPARE(object->property("qobjectTest").toInt(), 20);
|
||||||
|
QCOMPARE(object->property("qobjectMethodTest").toInt(), 1); // first call of method, so count = 1.
|
||||||
QCOMPARE(object->property("qobjectMinorVersionTest").toInt(), 20);
|
QCOMPARE(object->property("qobjectMinorVersionTest").toInt(), 20);
|
||||||
QCOMPARE(object->property("qobjectMajorVersionTest").toInt(), 20);
|
QCOMPARE(object->property("qobjectMajorVersionTest").toInt(), 20);
|
||||||
QCOMPARE(object->property("qobjectParentedTest").toInt(), 26);
|
QCOMPARE(object->property("qobjectParentedTest").toInt(), 26);
|
||||||
|
|
Loading…
Reference in New Issue