【问题标题】:QML: passing JS object to C++ member functionQML:将 JS 对象传递给 C++ 成员函数
【发布时间】:2017-11-14 13:34:42
【问题描述】:

我正在尝试将 JS 对象(映射)传递给带有签名的 C++ 成员函数

Q_INVOKABLE virtual bool generate(QObject* context);

通过使用

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

方法被调用(通过断点检测),但是传递的context参数是NULL。由于the documentation 提到JS 对象将作为QVariantMap 传递,所以我尝试使用签名

Q_INVOKABLE virtual bool generate(QVariantMap* context);

但这在 MOC 期间失败了。使用

Q_INVOKABLE virtual bool generate(QVariantMap& context);

导致 QML 在运行时找不到方法(错误消息是“未知方法参数类型:QVariantMap&”)。

文档中只有一个将QVariantMap 从 C++ 传递到 QML 的示例,而不是另一个方向。

使用public slot 而不是Q_INVOKABLE 会显示完全相同的行为和错误。

【问题讨论】:

    标签: javascript c++ qt qml


    【解决方案1】:

    不要使用引用将值从 QML 世界传递到 CPP 世界。 这个简单的例子有效:

    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
    

    ma​​in.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();
    }
    

    ma​​in.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")))
    

    【讨论】:

      猜你喜欢
      • 2013-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-26
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 2018-04-01
      相关资源
      最近更新 更多