QObject: do allow setProperty() to change the type of the property
[ChangeLog][QtCore][QObject] Fixed a bug in setProperty() that caused a property change not to take effect if the old value compared equal using QVariant's equality operator, but the values were not strictly equal. Task-number: QTBUG-69744 Change-Id: I00e04a465fcf4fc1a462fffd1547885861a07a64 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io> Reviewed-by: Olivier Goffart (Woboq GmbH) <ogoffart@woboq.com>
This commit is contained in:
parent
4c22350278
commit
64a560d977
@ -3898,7 +3898,8 @@ bool QObject::setProperty(const char *name, const QVariant &value)
|
|||||||
d->extraData->propertyNames.append(name);
|
d->extraData->propertyNames.append(name);
|
||||||
d->extraData->propertyValues.append(value);
|
d->extraData->propertyValues.append(value);
|
||||||
} else {
|
} else {
|
||||||
if (value == d->extraData->propertyValues.at(idx))
|
if (value.userType() == d->extraData->propertyValues.at(idx).userType()
|
||||||
|
&& value == d->extraData->propertyValues.at(idx))
|
||||||
return false;
|
return false;
|
||||||
d->extraData->propertyValues[idx] = value;
|
d->extraData->propertyValues[idx] = value;
|
||||||
}
|
}
|
||||||
|
@ -2976,6 +2976,7 @@ void tst_QObject::dynamicProperties()
|
|||||||
|
|
||||||
QVERIFY(obj.dynamicPropertyNames().isEmpty());
|
QVERIFY(obj.dynamicPropertyNames().isEmpty());
|
||||||
|
|
||||||
|
// set a non-dynamic property
|
||||||
QVERIFY(obj.setProperty("number", 42));
|
QVERIFY(obj.setProperty("number", 42));
|
||||||
QVERIFY(obj.changedDynamicProperties.isEmpty());
|
QVERIFY(obj.changedDynamicProperties.isEmpty());
|
||||||
QCOMPARE(obj.property("number").toInt(), 42);
|
QCOMPARE(obj.property("number").toInt(), 42);
|
||||||
@ -2983,19 +2984,30 @@ void tst_QObject::dynamicProperties()
|
|||||||
QVERIFY(!obj.setProperty("number", "invalid string"));
|
QVERIFY(!obj.setProperty("number", "invalid string"));
|
||||||
QVERIFY(obj.changedDynamicProperties.isEmpty());
|
QVERIFY(obj.changedDynamicProperties.isEmpty());
|
||||||
|
|
||||||
|
// set a dynamic property
|
||||||
QVERIFY(!obj.setProperty("myuserproperty", "Hello"));
|
QVERIFY(!obj.setProperty("myuserproperty", "Hello"));
|
||||||
QCOMPARE(obj.changedDynamicProperties.count(), 1);
|
QCOMPARE(obj.changedDynamicProperties.count(), 1);
|
||||||
QCOMPARE(obj.changedDynamicProperties.first(), QByteArray("myuserproperty"));
|
QCOMPARE(obj.changedDynamicProperties.first(), QByteArray("myuserproperty"));
|
||||||
//check if there is no redundant DynamicPropertyChange events
|
//check if there is no redundant DynamicPropertyChange events
|
||||||
QVERIFY(!obj.setProperty("myuserproperty", "Hello"));
|
QVERIFY(!obj.setProperty("myuserproperty", "Hello"));
|
||||||
QCOMPARE(obj.changedDynamicProperties.count(), 1);
|
QCOMPARE(obj.changedDynamicProperties.count(), 1);
|
||||||
obj.changedDynamicProperties.clear();
|
|
||||||
|
|
||||||
|
QCOMPARE(obj.property("myuserproperty").type(), QVariant::String);
|
||||||
QCOMPARE(obj.property("myuserproperty").toString(), QString("Hello"));
|
QCOMPARE(obj.property("myuserproperty").toString(), QString("Hello"));
|
||||||
|
|
||||||
QCOMPARE(obj.dynamicPropertyNames().count(), 1);
|
QCOMPARE(obj.dynamicPropertyNames().count(), 1);
|
||||||
QCOMPARE(obj.dynamicPropertyNames().first(), QByteArray("myuserproperty"));
|
QCOMPARE(obj.dynamicPropertyNames().first(), QByteArray("myuserproperty"));
|
||||||
|
|
||||||
|
// change type of the dynamic property
|
||||||
|
obj.changedDynamicProperties.clear();
|
||||||
|
QVERIFY(!obj.setProperty("myuserproperty", QByteArray("Hello")));
|
||||||
|
QCOMPARE(obj.changedDynamicProperties.count(), 1);
|
||||||
|
QCOMPARE(obj.changedDynamicProperties.first(), QByteArray("myuserproperty"));
|
||||||
|
QCOMPARE(obj.property("myuserproperty").type(), QVariant::ByteArray);
|
||||||
|
QCOMPARE(obj.property("myuserproperty").toString(), QByteArray("Hello"));
|
||||||
|
|
||||||
|
// unset the property
|
||||||
|
obj.changedDynamicProperties.clear();
|
||||||
QVERIFY(!obj.setProperty("myuserproperty", QVariant()));
|
QVERIFY(!obj.setProperty("myuserproperty", QVariant()));
|
||||||
|
|
||||||
QCOMPARE(obj.changedDynamicProperties.count(), 1);
|
QCOMPARE(obj.changedDynamicProperties.count(), 1);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user