[Interest] QMetaProperty::write behavior changed with Qt 5.6 - Bug?

Christian Ehringfeld c.ehringfeld at t-online.de
Fri May 6 23:44:25 CEST 2016


Hello,

The behavior of  QMetaProperty::write has changed with 5.6. 
In a
special situation it is no longer working as intended (by me). This
appears to be a show stopper for my project.

// working with Qt < 5.6, failing with Qt 5.6
 void EntityHelper::setListProperty(const QSharedPointer<Entity> &entity, QList<QSharedPointer<Entity>> &list, const QMetaProperty &property)  {
 QVariant var;
 var.setValue<QList<QSharedPointer<Entity>>>(list);
 property.write(entity.data(), var); //returns false and property attribute is not being changed - but it should be...
 }
 
 
The problem seems to be related to Lists, as the following code (for single properties) still works:
     
// single Entities are still being written - even with Qt 5.6
void EntityHelper::setProperty(const QSharedPointer<Entity> &entity, QSharedPointer<Entity> value, const QMetaProperty &property) {
	if (value && value->getProperty(value->getPrimaryKey()).toLongLong() > -1) {
	    QVariant var;
	    var.setValue<QSharedPointer<Entity>>(value);
	    property.write(entity.data(), var); //returns true, property is being changed
	}
}

A few explanations for a general understanding of where the code belongs to and what it should do:
Every entity class inherits from my main "Entity" class. Entity inherits from QObject and uses the Q_OBJECT macro.
Each Entity Object is wrapped by a QSharedPointer (to be on the safe side, memory-wise).
Properties in the child classes are defined with the Q_PROPERTY macro.

For example:
// defining a property:
Q_PROPERTY(QSharedPointer<Person> mainTeacher READ getMainTeacher WRITE setMainTeacher)
// defining a list property:
Q_PROPERTY(QList<QSharedPointer<Person>> persons READ getPersons WRITE setPersons)
(You can find the code here: https://github.com/Professi/cuteentitymanager/blob/master/src/entityhelper.cpp)

I've seen that some changes have been made to QMetaProperty::write since Qt5.5 https://github.com/qtproject/qtbase/blob/5.6/src/corelib/kernel/qmetaobject.cpp (Line 3038 ff.)

The problem appears in a Linux environment (GCC/Clang) as well as in Windows (MinGW).

I have already  asked this question in the Qt Forum and was sent on to this place.
I can't find a way to fix this problem. Is it a bug or a feature? Does anybody have an idea for a workaround?



Best regards
Christian Ehringfeld
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20160506/7828a921/attachment.html>


More information about the Interest mailing list