2017-11-14 114 views
5

Próbuję przekazać obiekt JS (mapa) do C funkcji członka ++ z podpisemQML: przekazaniem obiektu JS do C++ funkcji członka

Q_INVOKABLE virtual bool generate(QObject* context); 

za pomocą

a.generate({foo: "bar"}); 

Sposób jest wywoływany (wykrywany przez punkt przerwania), ale przekazany parametr context to NULL. Od the documentation wspomina, że ​​obiekty JS będą przekazywane jako QVariantMap, próbowałem przy użyciu podpisu

Q_INVOKABLE virtual bool generate(QVariantMap* context); 

ale nie powiodło się podczas MOC. Korzystanie

Q_INVOKABLE virtual bool generate(QVariantMap& context); 

powoduje metody nie można znaleźć w czasie wykonywania przez QML (komunikat o błędzie „Nieznany typ parametru metoda: QVariantMap &”).

W dokumentacji podano tylko przykład przekazania QVariantMap z C++ do QML, a nie w przeciwnym kierunku.

Używanie public slot zamiast Q_INVOKABLE pokazuje dokładnie to samo zachowanie i błędy.

Odpowiedz

5

Nie używaj referencji do przekazywania wartości ze świata QML do świata CPP. Ten prosty przykład działa:

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"}); 
     } 
    } 
} 

kliknij okno, to zostanie wydrukowane następujące komunikat w konsoli wyjściowej:

QMap(("foo", QVariant(QString, "bar"))) 
+0

Dziękuję, to działa. – pmf