diff options
| author | Soheil Armin <soheil.armin@qt.io> | 2023-12-04 12:13:34 +0200 |
|---|---|---|
| committer | Soheil Armin <soheil.armin@qt.io> | 2024-02-15 10:07:11 +0200 |
| commit | 9ca6eede194d7039180c2b39099c8688f1160b44 (patch) | |
| tree | 91aab3a762f81df1fa5974b1117cf11d5ccf5067 /src/quick/platform/android/qandroidquickviewembedding.cpp | |
| parent | 1d1ba46f54bcec6449d285c8f1f71540cdb02015 (diff) | |
Android: Add setProperty() to QtQuickView
Add setProperty() function to QtQuickView to set the property values
from Java basic types including String, Int, Double and Boolean on the
root object of underlying QQuickView.
Pick-to: 6.7
Task-number: QTBUG-119341
Change-Id: I84e9d8a42bd6f2aa126255c206b0238cae8ab199
Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io>
Diffstat (limited to 'src/quick/platform/android/qandroidquickviewembedding.cpp')
| -rw-r--r-- | src/quick/platform/android/qandroidquickviewembedding.cpp | 52 |
1 files changed, 50 insertions, 2 deletions
diff --git a/src/quick/platform/android/qandroidquickviewembedding.cpp b/src/quick/platform/android/qandroidquickviewembedding.cpp index 2a1bd81b83..2ef7355262 100644 --- a/src/quick/platform/android/qandroidquickviewembedding.cpp +++ b/src/quick/platform/android/qandroidquickviewembedding.cpp @@ -6,6 +6,7 @@ #include <QtCore/qjnienvironment.h> #include <QtCore/qjniobject.h> #include <QtCore/qjnitypes.h> +#include <QtQuick/qquickitem.h> QT_BEGIN_NAMESPACE @@ -14,6 +15,13 @@ Q_DECLARE_JNI_CLASS(QtQuickView, "org/qtproject/qt/android/QtQuickView"); Q_DECLARE_JNI_CLASS(QtWindow, "org/qtproject/qt/android/QtWindow"); Q_DECLARE_JNI_CLASS(View, "android/view/View"); +Q_DECLARE_JNI_CLASS(Void, "java/lang/Void"); +Q_DECLARE_JNI_CLASS(Integer, "java/lang/Integer"); +Q_DECLARE_JNI_CLASS(Double, "java/lang/Double"); +Q_DECLARE_JNI_CLASS(Float, "java/lang/Float"); +Q_DECLARE_JNI_CLASS(Boolean, "java/lang/Boolean"); +Q_DECLARE_JNI_CLASS(String, "java/lang/String"); + namespace QtAndroidQuickViewEmbedding { void createQuickView(JNIEnv*, jobject nativeWindow, jstring qmlUri, jint width, jint height, @@ -41,10 +49,50 @@ namespace QtAndroidQuickViewEmbedding }); } + void setRootObjectProperty(JNIEnv *env, jobject object, jlong windowReference, + jstring propertyName, jobject value) + { + Q_UNUSED(env); + Q_UNUSED(object); + + QQuickItem *rootObject = reinterpret_cast<QQuickView *>(windowReference)->rootObject(); + if (!rootObject) { + qWarning() << "QtQuickView instance does not own a root object."; + return; + } + + const QString property = QJniObject(propertyName).toString(); + const QMetaObject *rootMetaObject = rootObject->metaObject(); + int propertyIndex = rootMetaObject->indexOfProperty(qPrintable(property)); + if (propertyIndex < 0) { + qWarning("Property %s does not exist in the root QML object.", qPrintable(property)); + return; + } + + QMetaProperty metaProperty = rootMetaObject->property(propertyIndex); + const QJniObject propertyValue(value); + const QByteArray valueClassname = propertyValue.className(); + + if (valueClassname == QtJniTypes::Traits<QtJniTypes::String>::className()) + metaProperty.write(rootObject, propertyValue.toString()); + else if (valueClassname == QtJniTypes::Traits<QtJniTypes::Integer>::className()) + metaProperty.write(rootObject, propertyValue.callMethod<jint>("intValue")); + else if (valueClassname == QtJniTypes::Traits<QtJniTypes::Double>::className()) + metaProperty.write(rootObject, propertyValue.callMethod<jdouble>("doubleValue")); + else if (valueClassname == QtJniTypes::Traits<QtJniTypes::Float>::className()) + metaProperty.write(rootObject, propertyValue.callMethod<jfloat>("floatValue")); + else if (valueClassname == QtJniTypes::Traits<QtJniTypes::Boolean>::className()) + metaProperty.write(rootObject, propertyValue.callMethod<jboolean>("booleanValue")); + else + qWarning("Setting the property type of %s is not supported.", valueClassname.data()); + } + bool registerNatives(QJniEnvironment& env) { return env.registerNativeMethods(QtJniTypes::Traits<QtJniTypes::QtQuickView>::className(), - {Q_JNI_NATIVE_SCOPED_METHOD(createQuickView, - QtAndroidQuickViewEmbedding)}); + {Q_JNI_NATIVE_SCOPED_METHOD(createQuickView, + QtAndroidQuickViewEmbedding), + Q_JNI_NATIVE_SCOPED_METHOD(setRootObjectProperty, + QtAndroidQuickViewEmbedding)}); } } |
