2017-11-14 25 views
5

QML: मैं एक हस्ताक्षर के साथ एक सी ++ सदस्य कार्य करने के लिए एक जे एस वस्तु (नक्शा) पारित करने के लिए कोशिश कर रहा हूँ

Q_INVOKABLE virtual bool generate(QObject* context); 

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

विधि का उपयोग कर सेल्सियस तक ++ सदस्य समारोह जे एस वस्तु गुजर कहा जाता है (ब्रेकपॉइंट के माध्यम से पता चला), लेकिन पास context पैरामीटर NULL है। चूंकि the documentation कहा गया है कि जे एस वस्तुओं QVariantMap के रूप में पारित हो जाएगा, मैं हस्ताक्षर

Q_INVOKABLE virtual bool generate(QVariantMap* context); 

उपयोग करने की कोशिश की है, लेकिन इस एमओसी के दौरान विफल रहा है।

Q_INVOKABLE virtual bool generate(QVariantMap& context); 

पद्धति का उपयोग का कारण बनता है (त्रुटि संदेश ": QVariantMap & अज्ञात विधि पैरामीटर प्रकार" है) QML द्वारा रन टाइम पर नहीं पाया जा करने के लिए।

प्रलेखन में केवल QVariantMap को C++ से QML तक पारित करने का एक उदाहरण है, दूसरी दिशा में नहीं।

Q_INVOKABLE के बजाय public slot का उपयोग करके वही व्यवहार और त्रुटियां दिखाती हैं।

उत्तर

5

QML दुनिया से सीपीपी दुनिया में मूल्यों को पास करने के संदर्भों का उपयोग न करें। यह सरल उदाहरण काम करता है:

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

विंडो में क्लिक करें, यह आउटपुट कंसोल में निम्नलिखित संदेश प्रिंट करेगा:

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

धन्यवाद, यह काम करता है। – pmf

संबंधित मुद्दे

 संबंधित मुद्दे