我遇到了以下错误
"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/