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.

Pick-to: 6.5 6.6
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>
This commit is contained in:
Ulf Hermann 2023-06-07 09:27:39 +02:00
parent cd16a5ffb9
commit 761b455d47
5 changed files with 17 additions and 3 deletions

View File

@ -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)

View File

@ -2,5 +2,8 @@ import QtQml
import Test
UnregisteredValueTypeHandler {
Component.onCompleted: consume(produce())
Component.onCompleted: {
consume(produce())
consume(produceDerived())
}
}

View File

@ -154,6 +154,7 @@ void registerTypes()
qmlRegisterTypesAndRevisions<ObjectWithEnums>("TypedEnums", 1);
qmlRegisterTypesAndRevisions<GadgetWithEnums>("TypedEnums", 1);
QMetaType::registerConverter<UnregisteredValueDerivedType, UnregisteredValueBaseType>();
qmlRegisterTypesAndRevisions<UnregisteredValueTypeHandler>("Test", 1);
}

View File

@ -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; }
};

View File

@ -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)