diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2023-06-07 09:27:39 +0200 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2023-06-08 05:21:34 +0000 |
commit | 5769841f103261edc2e2cf881e7ba7fd6f3846b5 (patch) | |
tree | 6b88562c9b279a55aedac4edc194f7050552bcdb | |
parent | 4c0a423154543c119f0e51dd5c05e9d7fc24345a (diff) |
QML: Re-add QMetaType::convert() attempt for argument conversion
There are people who depend on QMetaType to convert their types. This is
not nice, but removing it breaks compatibility.
Fixes: QTBUG-114340
Change-Id: I0a7f54b8fd0f77b71e7e56f65ef7d6f91c876237
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
(cherry picked from commit 761b455d4741bdbef47845623d6f44bdc8a464b5)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r-- | src/qml/jsruntime/qv4qobjectwrapper.cpp | 6 | ||||
-rw-r--r-- | tests/auto/qml/qqmllanguage/data/unregisteredValueTypeConversion.qml | 5 | ||||
-rw-r--r-- | tests/auto/qml/qqmllanguage/testtypes.cpp | 1 | ||||
-rw-r--r-- | tests/auto/qml/qqmllanguage/testtypes.h | 6 | ||||
-rw-r--r-- | tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp | 2 |
5 files changed, 17 insertions, 3 deletions
diff --git a/src/qml/jsruntime/qv4qobjectwrapper.cpp b/src/qml/jsruntime/qv4qobjectwrapper.cpp index f937ee2ca5..a8db3e95a4 100644 --- a/src/qml/jsruntime/qv4qobjectwrapper.cpp +++ b/src/qml/jsruntime/qv4qobjectwrapper.cpp @@ -2195,7 +2195,11 @@ bool CallArgument::fromValue(QMetaType metaType, ExecutionEngine *engine, const qvariantPtr = new (&allocData) QVariant(metaType); type = QVariantWrappedType; - return ExecutionEngine::metaTypeFromJS(value, metaType, qvariantPtr->data()); + if (ExecutionEngine::metaTypeFromJS(value, metaType, qvariantPtr->data())) + return true; + + const QVariant v = ExecutionEngine::toVariant(value, metaType); + return QMetaType::convert(v.metaType(), v.constData(), metaType, qvariantPtr->data()); } ReturnedValue CallArgument::toValue(ExecutionEngine *engine) diff --git a/tests/auto/qml/qqmllanguage/data/unregisteredValueTypeConversion.qml b/tests/auto/qml/qqmllanguage/data/unregisteredValueTypeConversion.qml index ecf2130f5a..e0cebe58fc 100644 --- a/tests/auto/qml/qqmllanguage/data/unregisteredValueTypeConversion.qml +++ b/tests/auto/qml/qqmllanguage/data/unregisteredValueTypeConversion.qml @@ -2,5 +2,8 @@ import QtQml import Test UnregisteredValueTypeHandler { - Component.onCompleted: consume(produce()) + Component.onCompleted: { + consume(produce()) + consume(produceDerived()) + } } diff --git a/tests/auto/qml/qqmllanguage/testtypes.cpp b/tests/auto/qml/qqmllanguage/testtypes.cpp index f703eece2a..e320cae8ae 100644 --- a/tests/auto/qml/qqmllanguage/testtypes.cpp +++ b/tests/auto/qml/qqmllanguage/testtypes.cpp @@ -154,6 +154,7 @@ void registerTypes() qmlRegisterTypesAndRevisions<ObjectWithEnums>("TypedEnums", 1); qmlRegisterTypesAndRevisions<GadgetWithEnums>("TypedEnums", 1); + QMetaType::registerConverter<UnregisteredValueDerivedType, UnregisteredValueBaseType>(); qmlRegisterTypesAndRevisions<UnregisteredValueTypeHandler>("Test", 1); } diff --git a/tests/auto/qml/qqmllanguage/testtypes.h b/tests/auto/qml/qqmllanguage/testtypes.h index a16580e3f8..7545fd251a 100644 --- a/tests/auto/qml/qqmllanguage/testtypes.h +++ b/tests/auto/qml/qqmllanguage/testtypes.h @@ -2572,6 +2572,11 @@ struct UnregisteredValueBaseType int foo = 12; }; +struct UnregisteredValueDerivedType: public UnregisteredValueBaseType +{ + int bar = 13; +}; + class UnregisteredValueTypeHandler: public QObject { Q_OBJECT @@ -2581,6 +2586,7 @@ public: public slots: UnregisteredValueBaseType produce() { return UnregisteredValueBaseType(); } + UnregisteredValueDerivedType produceDerived() { return UnregisteredValueDerivedType(); } void consume(UnregisteredValueBaseType) { ++consumed; } }; diff --git a/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp b/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp index 7bef01f3eb..2ce2185f29 100644 --- a/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp +++ b/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp @@ -7998,7 +7998,7 @@ void tst_qqmllanguage::unregisteredValueTypeConversion() QVERIFY(!o.isNull()); UnregisteredValueTypeHandler *handler = qobject_cast<UnregisteredValueTypeHandler *>(o.data()); Q_ASSERT(handler); - QCOMPARE(handler->consumed, 1); + QCOMPARE(handler->consumed, 2); } QTEST_MAIN(tst_qqmllanguage) |