我得到以下错误
"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();
}
答案 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代码必须对返回值进行后处理才能获得所需的数据。