diff options
| author | Soheil Armin <soheil.armin@qt.io> | 2023-12-04 15:16:33 +0200 |
|---|---|---|
| committer | Soheil Armin <soheil.armin@qt.io> | 2024-02-15 10:07:14 +0200 |
| commit | 2023c1664bc3b439edbb0da871e14000ec1c148a (patch) | |
| tree | 9b70bf2d31b19d40f438eccae724eec49f4e141d /src/quick/platform/android/qandroidquickviewembedding.cpp | |
| parent | 9ca6eede194d7039180c2b39099c8688f1160b44 (diff) | |
Android: Add getProperty() to QtQuickView
Add getProperty() to QtQuickView to read QML property values of the
root object of QQuickView and convert them to Java types.
Currently Boolean, Int, Double, Float and String types are covered.
The return type of getProperty() is generic.
Pick-to: 6.7
Task-number: QTBUG-119342
Change-Id: I799b4768a7e252daa048c024911ddae9e99b0504
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 | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/src/quick/platform/android/qandroidquickviewembedding.cpp b/src/quick/platform/android/qandroidquickviewembedding.cpp index 2ef7355262..007a14f694 100644 --- a/src/quick/platform/android/qandroidquickviewembedding.cpp +++ b/src/quick/platform/android/qandroidquickviewembedding.cpp @@ -87,11 +87,70 @@ namespace QtAndroidQuickViewEmbedding qWarning("Setting the property type of %s is not supported.", valueClassname.data()); } + jobject getRootObjectProperty(JNIEnv *env, jobject object, jlong windowReference, + jstring propertyName) + { + Q_UNUSED(object); + Q_ASSERT(env); + + const QString property = QJniObject(propertyName).toString(); + QQuickView *view = reinterpret_cast<QQuickView *>(windowReference); + QQuickItem *rootObject = view->rootObject(); + if (!rootObject) { + qWarning("Cannot read property %s as the QtQuickView instance (%s)" + "does not own a root object.", + qPrintable(property), + qPrintable(view->source().toString())); + return nullptr; + } + + const QMetaObject *rootMetaObject = rootObject->metaObject(); + int propertyIndex = rootMetaObject->indexOfProperty(property.toUtf8().constData()); + if (propertyIndex < 0) { + qWarning("Cannot read property %s as it does not exist in the root QML object.", + qPrintable(property)); + return nullptr; + } + + QMetaProperty metaProperty = rootMetaObject->property(propertyIndex); + QVariant propertyValue = metaProperty.read(rootObject); + const int propertyTypeId = propertyValue.typeId(); + + switch (propertyTypeId) { + case QMetaType::Type::Int: + return env->NewLocalRef( + QJniObject::construct<QtJniTypes::Integer>(get<int>(std::move(propertyValue))) + .object()); + case QMetaType::Type::Double: + return env->NewLocalRef( + QJniObject::construct<QtJniTypes::Double>(get<double>(std::move(propertyValue))) + .object()); + case QMetaType::Type::Float: + return env->NewLocalRef( + QJniObject::construct<QtJniTypes::Float>(get<float>(std::move(propertyValue))) + .object()); + case QMetaType::Type::Bool: + return env->NewLocalRef( + QJniObject::construct<QtJniTypes::Boolean>(get<bool>(std::move(propertyValue))) + .object()); + case QMetaType::Type::QString: + return env->NewLocalRef( + QJniObject::fromString(get<QString>(std::move(propertyValue))).object()); + default: + qWarning("Property %s cannot be converted to a supported Java data type.", + qPrintable(property)); + } + + return nullptr; + } + bool registerNatives(QJniEnvironment& env) { return env.registerNativeMethods(QtJniTypes::Traits<QtJniTypes::QtQuickView>::className(), {Q_JNI_NATIVE_SCOPED_METHOD(createQuickView, QtAndroidQuickViewEmbedding), Q_JNI_NATIVE_SCOPED_METHOD(setRootObjectProperty, + QtAndroidQuickViewEmbedding), + Q_JNI_NATIVE_SCOPED_METHOD(getRootObjectProperty, QtAndroidQuickViewEmbedding)}); } } |
