QVariant: Change metatype in convert() even on failure
The documentation of convert promised that “If the cast cannot be done, the variant is still changed to the requested type”. This was not the case so far, because we returned too early if canConvert returned false. This commit changes the behavior of the method to reflect its documentation. The documented behavior seems more useful than the alternative of not changing the metaType, at least for common use cases inside qtdeclarative. Change-Id: I09b5a5efb7344e76e93de278e35c7fb2b2f87dcd Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
parent
8e2933f140
commit
6892300127
@ -2032,10 +2032,10 @@ bool QVariant::convert(QMetaType targetType)
|
|||||||
QVariant oldValue = *this;
|
QVariant oldValue = *this;
|
||||||
|
|
||||||
clear();
|
clear();
|
||||||
|
create(targetType.id(), nullptr);
|
||||||
if (!oldValue.canConvert(targetType))
|
if (!oldValue.canConvert(targetType))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
create(targetType.id(), nullptr);
|
|
||||||
// Fail if the value is not initialized or was forced null by a previous failed convert.
|
// Fail if the value is not initialized or was forced null by a previous failed convert.
|
||||||
if (oldValue.d.is_null && oldValue.d.typeId() != QMetaType::Nullptr)
|
if (oldValue.d.is_null && oldValue.d.typeId() != QMetaType::Nullptr)
|
||||||
return false;
|
return false;
|
||||||
|
@ -99,6 +99,7 @@ private slots:
|
|||||||
|
|
||||||
void canConvert_data();
|
void canConvert_data();
|
||||||
void canConvert();
|
void canConvert();
|
||||||
|
void convert();
|
||||||
|
|
||||||
void toSize_data();
|
void toSize_data();
|
||||||
void toSize();
|
void toSize();
|
||||||
@ -555,6 +556,16 @@ void tst_QVariant::canConvert()
|
|||||||
QCOMPARE(val.canConvert(23876), false);
|
QCOMPARE(val.canConvert(23876), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tst_QVariant::convert()
|
||||||
|
{
|
||||||
|
// verify that after convert(), the variant's type has been changed
|
||||||
|
QVariant var = QVariant::fromValue(QString("A string"));
|
||||||
|
var.convert(QMetaType::fromType<int>());
|
||||||
|
QCOMPARE(var.metaType(), QMetaType::fromType<int>());
|
||||||
|
QCOMPARE(var.toInt(), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void tst_QVariant::toInt_data()
|
void tst_QVariant::toInt_data()
|
||||||
{
|
{
|
||||||
QTest::addColumn<QVariant>("value");
|
QTest::addColumn<QVariant>("value");
|
||||||
@ -2343,8 +2354,8 @@ void tst_QVariant::qvariant_cast_QObject()
|
|||||||
QVERIFY(!data.canConvert(QMetaType::QObjectStar));
|
QVERIFY(!data.canConvert(QMetaType::QObjectStar));
|
||||||
QVERIFY(!data.canConvert(::qMetaTypeId<QObject*>()));
|
QVERIFY(!data.canConvert(::qMetaTypeId<QObject*>()));
|
||||||
QVERIFY(!data.value<QObject*>());
|
QVERIFY(!data.value<QObject*>());
|
||||||
QVERIFY(!data.convert(QMetaType::QObjectStar));
|
|
||||||
QVERIFY(data.userType() != QMetaType::QObjectStar);
|
QVERIFY(data.userType() != QMetaType::QObjectStar);
|
||||||
|
QVERIFY(!data.convert(QMetaType::QObjectStar));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user