Add ability to retrieve QJSEngine for a given QObject
authorSimon Hausmann <simon.hausmann@theqtcompany.com>
Mon, 12 Jan 2015 12:07:38 +0000 (13:07 +0100)
committerSimon Hausmann <simon.hausmann@digia.com>
Mon, 12 Jan 2015 18:19:35 +0000 (19:19 +0100)
[ChangeLog][QtQml] Added qjsEngine(QObject*) getter similar to qmlEngine(object)
that allows retrieving the engine for an exposed object.

Change-Id: Id14adec58d45fe58133f65bab773b07d6bc18569
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
src/qml/jsapi/qjsengine.cpp
src/qml/jsapi/qjsengine.h
tests/auto/qml/qjsengine/tst_qjsengine.cpp

index c6caae2..831287d 100644 (file)
@@ -565,6 +565,24 @@ QQmlPropertyCache *QJSEnginePrivate::createCache(const QMetaObject *mo)
     }
 }
 
+/*!
+   \since 5.5
+   \relates QJSEngine
+
+   Returns the QJSEngine associated with \a object, if any.
+
+   This function is useful if you have exposed a QObject to the JavaScript environment
+   and later in your program would like to regain access. It does not require you to
+   keep the wrapper around that was returned from QJSEngine::newQObject().
+ */
+QJSEngine *qjsEngine(const QObject *object)
+{
+    QQmlData *data = QQmlData::get(object, false);
+    if (!data || data->jsWrapper.isNullOrUndefined())
+        return 0;
+    return data->jsWrapper.engine()->jsEngine();
+}
+
 QT_END_NAMESPACE
 
 #include "moc_qjsengine.cpp"
index bddc6f1..f24808f 100644 (file)
@@ -127,6 +127,8 @@ inline QVariant qjsvalue_cast<QVariant>(const QJSValue &value)
     return value.toVariant();
 }
 
+Q_QML_EXPORT QJSEngine *qjsEngine(const QObject *);
+
 QT_END_NAMESPACE
 
 #endif // QJSENGINE_H
index b8c5f60..13e60fe 100644 (file)
@@ -174,6 +174,8 @@ private slots:
 
     void privateMethods();
 
+    void engineForObject();
+
 signals:
     void testSignal();
 };
@@ -3624,6 +3626,19 @@ void tst_QJSEngine::privateMethods()
     }
 }
 
+void tst_QJSEngine::engineForObject()
+{
+    QObject object;
+    {
+        QJSEngine engine;
+        QVERIFY(!qjsEngine(&object));
+        QJSValue wrapper = engine.newQObject(&object);
+        QQmlEngine::setObjectOwnership(&object, QQmlEngine::CppOwnership);
+        QCOMPARE(qjsEngine(&object), wrapper.engine());
+    }
+    QVERIFY(!qjsEngine(&object));
+}
+
 QTEST_MAIN(tst_QJSEngine)
 
 #include "tst_qjsengine.moc"