1

我得到以下错误

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

主文件

#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();
}
4

4 回答 4

1

看来您的原始问题有 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 代码必须对返回值进行后处理以获取您需要的数据。

于 2016-04-08T22:50:11.153 回答
0

你的第二个参数有QString&类型,但它应该是const QString&.

于 2013-07-02T06:42:34.513 回答
0

js和Qt数据类型的数据转换是通过QScriptValue来完成的,基本上就是说slot里面的QString不是你传入的js字符串。

传递引用不能起到神奇的作用,只需考虑其他方式。

例如,您可以添加一个返回最后一个错误的函数。

于 2013-07-06T04:20:26.993 回答
0

我不是 JavaScript 专家。但是在谷歌“通过javascript中的参数返回值”和“在javascript中返回多个值”之后。但是我自己没有找到标准。

我认为您在参数中具有返回值的方式是不可能的。那么QString&这里就没有意义了。

希望其他人可以就这个话题教我或纠正我,谢谢。

于 2013-07-02T14:08:17.500 回答