2017-11-14 158 views
5

QML: Bir imzası ile bir C++ üye işlev için bir JS nesnesi (harita) geçmesine çalışıyorum

Q_INVOKABLE virtual bool generate(QObject* context); 

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

yöntemi kullanarak üye işlev C++ JS nesnesi geçirmeden çağrılır (kesme noktası aracılığıyla algılanır), ancak geçirilen context parametresi NULL'dur. the documentation JS nesneleri QVariantMap olarak geçilecek bahseder beri, imzayı

Q_INVOKABLE virtual bool generate(QVariantMap* context); 

kullanarak denedim ama bu MOC sırasında başarısız oldu. yöntem

Q_INVOKABLE virtual bool generate(QVariantMap& context); 

neden olur kullanarak (hata mesajı ": QVariantMap & Bilinmeyen bir yöntem parametresi türü") QML tarafından çalışma zamanında bulunabilir değil.

Belgelerin, yalnızca başka bir yönde değil, C++ - QML arasında bir QVariantMap geçirilmesi örneği vardır.

Q_INVOKABLE yerine public slot kullanmak, tam olarak aynı davranışı ve hataları gösterir.

cevap

5

QML dünyasından CPP dünyasına değerleri aktarmak için referansları kullanmayın. Bu basit bir örnek çalışır:

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

pencerede tıklayın, bu çıkış konsolunda aşağıdaki msj yazdırır:

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

Teşekkür ederim, bu işe yarar. – pmf