javascript - QtScript 无法调用参数类型为 "QString &"的函数

标签 javascript c++ qt qtscript

我遇到了以下错误

"TypeError: cannot call sayHello(): argument 2 has unknown type `QString&' (register the type with qScriptRegisterMetaType())"

当执行我的Qt程序test.exe调用一个javascrip文件haha.js。我试图做的是从“void sayHello(const QString &name, QString &result);”返回一个值(“result”)。在javascript中。看起来 QtScript 理解 (const QString &) 但无法理解 (QString &)。知道我做错了什么吗?

哈哈.js

h = new Haha();
result = "";
h.sayHello("henry", result);
result;

Qt程序包括:haha.h、haha.cpp、main.cpp

哈哈哈哈哈

#ifndef HAHA_H
#define HAHA_H

#include <QObject>

class Haha : public QObject
{
    Q_OBJECT

public:
    explicit Haha(QObject *parent = 0);

public slots:
    void sayHello(const QString &name, QString &result);
};

#endif // HAHA_H

哈哈.cpp

#include "haha.h"

Haha::Haha(QObject *parent) :
    QObject(parent)
{
}

void Haha::sayHello(const QString &name, QString &result)
{
    result = "Hello " + name;
}

主要.cpp

#include <QtCore/QCoreApplication>
#include <QtDebug>
#include <QtScript>

#include "haha.h"

Q_SCRIPT_DECLARE_QMETAOBJECT(Haha, QObject*)

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QScriptEngine engine;
    QScriptValue HahaClass = engine.scriptValueFromQMetaObject<Haha>();
    engine.globalObject().setProperty("Haha", HahaClass);

    QString fileName = "haha.js";
    QFile scriptFile(fileName);
    if (!scriptFile.open(QIODevice::ReadOnly)) {
        return -1;
    }
    QTextStream b(&scriptFile);
    QString contents = b.readAll();
    scriptFile.close();

    QScriptValue result = engine.evaluate(contents, fileName);
    qDebug()<<result.toString();

    return a.exec();
}

最佳答案

看来您的原始问题有 2 个子问题:

Q1。如何避免上述运行时错误?

Q2。如何从 C++ 返回多个数据到 QML?

A1。 QML 似乎不能很好地识别 C++ 引用符号 &,这与您是否使用 const 无关。因此,如果您使用以下版本:

void sayHelloV2(const QString name, QString result);

运行时错误将消失。更确切地说,QML 确实允许第一个参数是 C++ 引用,因此以下版本也可以避免运行时错误:

void sayHelloV3(const QString &name, QString result);

这对我来说也是一个谜。也许 Qt 框架开发人员可以向我们解释原因。

A2。如果你想从C++返回多个数据到QML,一种解决方案是使用QVariantMap作为函数的返回类型,如下版本所示:

QVariantMap sayHelloV4(const QString name, QString result);

在您的 C++ 返回值中,您可以根据需要插入任意数量的数据。 (姓名、结果等)。但是您的 QML 代码必须对返回值进行后处理以获取您需要的数据。

关于javascript - QtScript 无法调用参数类型为 "QString &"的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17417012/

相关文章:

javascript - 如何在 react-leaflet 中动态更改 Circle 组件的颜色 Prop ?

c++ - 使用 gSOAP 和 Apache 部署网络服务

c++ - 创建不依赖于对象的方法

c++ - 使用 QVTK 在 Qt 中进行 PCL 可视化

c++ - QtCreator : Failed to start program. 路径或权限错误?

javascript - 如何使用 ng-repeat $index 在数组中查找元素

javascript、php、onchange 选择框不起作用

javascript - 在inApp浏览器中注入(inject)代码并在应用程序中获取它的返回值

c++ - 如何在 C++ 中同时连接 2 个 RFID 阅读器?

c++ - 槽中的 QMutex