qtpropertiesmetaobject

overloading qt properties


I've got a property of a custom type.

class foo : public QObject {
    Q_OBJECT
    Q_PROPERTY(Custom x READ x WRITE set_x)

public: 
    void set_x(Custom &x) { /*whatnot*/}
}

QJson effectively invokes the following dynamic assignment:

((QObject*)&foo_instance)->setProperty("x", QVariant(QString("something-from-json")))

which returns false, as documented in the Qt:

If the value is not compatible with the property's type, the property is not changed, and false is returned.

How can I shim this into my Custom value? Clearly defining a side-function void set_x(QString) or void set_x(QVariant) cannot possibly work, since the property system would be unaware of this accessor.

Also, where is the type compatibility checked? - the program control never reaches

int foo::qt_metacall(QMetaObject::Call _c, int _id, void **_a)

the function generated by the meta-object compiler..

How can I make Custom compatible with these types?


Solution

  • It can be useful to read The Property System

    Especially Properties and Custom Types part.

    If to be brief, all properties save as QVariant.
    You need to use Q_DECLARE_METATYPE macro to make your Custom type compatible with Qt properties.
    And after that you have to call qRegisterMetaType function to register your type.