2017-11-14 12 views
5

Tôi đang cố gắng để vượt qua một đối tượng JS (bản đồ) đến một chức năng C thành viên ++ với một chữ kýQML: đi qua đối tượng JS C++ chức năng thành viên

Q_INVOKABLE virtual bool generate(QObject* context); 

bằng cách sử dụng

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

Phương pháp này được gọi (được phát hiện qua điểm ngắt), nhưng thông số context được chuyển là NULL. Kể từ the documentation đề cập rằng đối tượng JS sẽ được thông qua như QVariantMap, tôi đã cố gắng sử dụng chữ ký

Q_INVOKABLE virtual bool generate(QVariantMap* context); 

nhưng điều này đã thất bại trong MOC. Sử dụng

Q_INVOKABLE virtual bool generate(QVariantMap& context); 

gây phương pháp để không bị phát hiện trong thời gian chạy bởi QML (thông báo lỗi là "Unknown loại tham số phương pháp: QVariantMap &").

Tài liệu chỉ có ví dụ về việc chuyển số QVariantMap từ C++ sang QML, không theo hướng khác.

Sử dụng public slot thay vì Q_INVOKABLE cho biết chính xác cùng một hành vi và lỗi.

Trả lời

5

Không sử dụng các tham chiếu để chuyển các giá trị từ thế giới QML sang thế giới CPP. ví dụ đơn giản này hoạt động:

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

nhấp vào trong cửa sổ, thao tác này sẽ in sau thông báo trong bảng điều khiển đầu ra:

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

Cảm ơn bạn, công trình này. – pmf

Các vấn đề liên quan