【问题标题】:QtScript can't call function with argument type "QString &"QtScript 无法调用参数类型为“QString &”的函数
【发布时间】:2013-07-02 03:38:43
【问题描述】:

我得到以下错误

"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

哈哈.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

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

【问题讨论】:

    标签: javascript c++ qt qtscript


    【解决方案1】:

    您的原始问题似乎有 2 个子问题:

    第一季度。如何避免上述运行时错误?

    第二季度。如何将多个数据从 C++ 返回到 QML?

    A1。 QML 似乎不能很好地识别 C++ 引用符号&amp;,这与您是否使用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 代码必须对返回值进行后处理才能获取您需要的数据。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 对于第二个参数,我打算使用“QString &”,这样我就可以传入一个 QString 并通过调用“void sayHello(const QString &name, QString &result)”获得结果
      • 使用QString sayHello(const QString&amp; name)从函数返回一个值。
      • 但我确实希望 sayHello() 返回错误代码和值。有没有办法让 (QString &) 工作?
      【解决方案3】:

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

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

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

      【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

      • 所以你的意思是没有办法从函数参数返回值?
      猜你喜欢
      • 2022-12-05
      • 2018-12-30
      • 2019-10-19
      • 1970-01-01
      • 2019-12-31
      • 1970-01-01
      • 2015-11-01
      • 1970-01-01
      • 2015-08-02
      相关资源
      最近更新 更多