kazmer
kazmer

Reputation: 521

How to send javascript object to C++ from qml?

I have a method in C++ that expects an object:

Q_INVOKABLE void sendValue (const MyClass &value);

I'd like to call this method from qml, inside a javascript function, like this:

MyApi.sendValue({
    "one":"one",
    "two":2.0,
    "three": false,
    "four": [ 5, 6 ],
    }
});

MyClass is defined as follows:

#ifndef MYCLASS_H
#define MYCLASS_H
#include <QString>
#include <QVariant>
class MyClass {
    QString one;
    double two;
    bool three;
    int four[10];
public:
    MyClass();
    ~MyClass();
    // getters, setters, etc.
};
Q_DECLARE_METATYPE(MyClass)
#endif // MYCLASS_H

In main.cpp, MyClass is registered with qRegisterMetaType<MyClass>(); But none of the setters gets called, only MyClass' default constructor.

Upvotes: 10

Views: 2758

Answers (1)

vpicaver
vpicaver

Reputation: 1801

You can send javascript objects to c++ from qml via QVariantMap and javascript array with QVariantList. It also goes the other way, you can send javascript object to qml using QVariantMap from c++. Just make your function in c++ Q_INVOKABLE or a slot and have the parameter be QVariantMap, and convert that QVariantMap into MyClass {}.

See http://doc.qt.io/qt-5/qtqml-cppintegration-data.html for details (search for QVariantList and QVariantMap to JavaScript Array and Object).

Upvotes: 8

Related Questions