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 761b455d47
)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
parent
1d48273786
commit
56a4c89922
|
@ -2190,7 +2190,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)
|
||||
|
|
|
@ -2,5 +2,8 @@ import QtQml
|
|||
import Test
|
||||
|
||||
UnregisteredValueTypeHandler {
|
||||
Component.onCompleted: consume(produce())
|
||||
Component.onCompleted: {
|
||||
consume(produce())
|
||||
consume(produceDerived())
|
||||
}
|
||||
}
|
||||
|
|
|
@ -150,6 +150,7 @@ void registerTypes()
|
|||
qmlRegisterTypesAndRevisions<DerivedValueType>("ValueTypes", 1);
|
||||
qmlRegisterTypesAndRevisions<GetterObject>("Test", 1);
|
||||
|
||||
QMetaType::registerConverter<UnregisteredValueDerivedType, UnregisteredValueBaseType>();
|
||||
qmlRegisterTypesAndRevisions<UnregisteredValueTypeHandler>("Test", 1);
|
||||
}
|
||||
|
||||
|
|
|
@ -2426,6 +2426,11 @@ struct UnregisteredValueBaseType
|
|||
int foo = 12;
|
||||
};
|
||||
|
||||
struct UnregisteredValueDerivedType: public UnregisteredValueBaseType
|
||||
{
|
||||
int bar = 13;
|
||||
};
|
||||
|
||||
class UnregisteredValueTypeHandler: public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
@ -2435,6 +2440,7 @@ public:
|
|||
|
||||
public slots:
|
||||
UnregisteredValueBaseType produce() { return UnregisteredValueBaseType(); }
|
||||
UnregisteredValueDerivedType produceDerived() { return UnregisteredValueDerivedType(); }
|
||||
void consume(UnregisteredValueBaseType) { ++consumed; }
|
||||
};
|
||||
|
||||
|
|
|
@ -7920,7 +7920,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)
|
||||
|
|
Loading…
Reference in New Issue