QtScript可以't调用参数类型为“”的函数;Q字符串&&”;

QtScript can't call function with argument type "QString &"

本文关键字:函数 字符串 amp 类型 可以 调用 QtScript 参数      更新时间:2023-09-26

我得到以下错误

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

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

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

哈哈,pp

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

原来的问题有两个子问题:

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代码必须对返回值进行后处理才能获得所需的数据。

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

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

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

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

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

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

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