I'm trying to pass a JS object (map) to a C++ member function with a signature
Q_INVOKABLE virtual bool generate(QObject* context);
by using
a.generate({foo: "bar"});
The method is called (detected via breakpoint), but the passed context parameter is NULL. Since the documentation mentions that JS objects will be passed as QVariantMap, I've tried using the signature
Q_INVOKABLE virtual bool generate(QVariantMap* context);
but this failed during MOC. Using
Q_INVOKABLE virtual bool generate(QVariantMap& context);
causes the method to not be found at runtime by QML (error message is "Unknown method parameter type: QVariantMap&").
The documentation only has an example of passing a QVariantMap from C++ to QML, not in the other direction.
Using a public slot instead of a Q_INVOKABLE shows exactly the same behavior and errors.
Don't use references to pass values from QML world to CPP world. This simple example works:
test.h
#ifndef TEST_H
#define TEST_H
#include <QObject>
#include <QDebug>
#include <QVariantMap>
class Test : public QObject
{
Q_OBJECT
public:
Test(){}
Q_INVOKABLE bool generate(QVariantMap context)
{qDebug() << context;}
};
#endif // TEST_H
main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include "test.h"
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
engine.rootContext()->setContextProperty(QStringLiteral("Test"), new Test());
engine.load(QUrl(QLatin1String("qrc:/main.qml")));
if (engine.rootObjects().isEmpty())
return -1;
return app.exec();
}
main.qml
import QtQuick 2.7
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.3
ApplicationWindow {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
MouseArea
{
anchors.fill: parent
onClicked:
{
Test.generate({foo: "bar"});
}
}
}
click in window, this will print following msg in output console:
QMap(("foo", QVariant(QString, "bar")))
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With