QMetaProperty::write behavior changed with Qt 5.6



  • I've written an ORM for Qt. With Qt5.6 I've run into a very special problem. The behavior of QMetaProperty::write has changed. It did work for me from Qt5 to Qt5.5, with 5.6 it is no longer working as intended.

    // 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...
     }
    

    Since Qt 5.6 this doesn't work anymore for QList<QSharedPointer<Entity>>.
    The problem seems to be related to such a list, 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.)

    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?


  • Moderators

    Hi, and welcome to the Qt forum!

    Looks like a bug to me. I think you should talk to the developers on the interest mailing list.

    Cheers!



Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.