Important: Please read the Qt Code of Conduct -

SetContextProperty of a class that extends Object

  • Hi,

    I saw in this website how to make a class that extends Object to set an instance as a property.

    I did it as they say but I had some troubles and finally I had to separate to another file the class, but when I try to do this

    @ApplicationData data;
    view.rootContext()->setContextProperty("applicationData", &data);@

    it gives this error:

    'QVariant::QVariant(void*)' is private

    I have tried to search the problem, and read about the classes priviledges but I don't know how to give an object as a property then. Thank you in advance.

  • I think you have to write much more of code...
    Maybe you forgot Q_OBJECT macro...

  • Thank you for the fast answer.

    I did just what the example was saying

    @class ApplicationData : public QObject
    Q_INVOKABLE QDateTime getCurrentDateTime() const {
    return QDateTime::currentDateTime();

    Well I had to write it in a separated file with the headers but it doesn't complaint about that, just gives back the error QVariant::QVariant(void*)'

  • I discovered the problem but not the solution. If I delete the macro Q_OBJECT from the code it doesn't give any problem, but I can not call the functions inside from the QML. But when I include it in the code it gives the problem:

    @ undefined reference to `vtable for ...' @

  • you need keep the Q_OBJECT macro (used on moc process), this is necessary to make your class a QObject.

    try call the function with explicitly cast:
    view.rootContext()->setContextProperty("applicationData", (QObject*)&data);

  • Yes I included it, I wrote in the header Q_OBJECT as the example but it's all the time appearing this error.

    @undefined reference to `vtable for ...'@

    With the explicitly cast it doesn't give me the other error. It's a beginning, thanks!

  • Are you using qmake?
    if yes, try put the Q_OBJECT macro, then re-run the qmake program, after that compile your program.

    A moc file need be genereted and included on your src list. (qmake do this for you)

  • I was doing it wrong, because what you said, I was doing it copying it directly. I discovered the way to add it correctly with Qtcreator.

    Really helpfull, Thanks a lot!

  • Use QVariant::fromValue:
    @view.rootContext()->setContextProperty("applicationData", QVariant::fromValue(data));@

Log in to reply