[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