QtScript无法使用参数类型“QString&”调用函数

时间:2013-07-02 03:38:43

标签: 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&)。知道我做错了吗?

haha​​.js

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

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

haha​​.h

#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

haha​​.cpp

#include "haha.h"

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

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

的main.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();
}

4 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

我认为你在参数中返回值的方法是不可能的。那么QString&就没有意义了。

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

答案 2 :(得分:0)

js和Qt数据类型之间的数据转换由QScriptValue完成,基本上这意味着插槽中的QString不是您传入的js字符串。

传递参考不能做到魔法,只需要考虑其他方式。

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

答案 3 :(得分:0)

您的原始问题似乎有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代码必须对返回值进行后处理才能获得所需的数据。