QtScript 不能调用参数类型为 "QString &" 的函数
QtScript can't call function with argument type "QString &"
我得到以下错误
"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字符串。
传递引用不能起到神奇的作用,只需考虑其他方式。
例如,您可以添加一个返回最后一个错误的函数。
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 将 hh:mm:ss.zzz 时间 QString 转换为毫秒的单行函数?
- 在 QString 插入函数中使用参数
- 将 QString 传递给类构造函数会更改新类中的 QString
- QtScript 不能调用参数类型为 "QString &" 的函数
- 返回QString的函数的QLabel文本集
- Qt 将 QString 传递给结构构造函数不起作用
- 为什么我不能在这里使用 QString::arg 函数?
- 将不同类型的QList转换为QString的静态函数
- 考虑到一些函数是const而另一些函数是非const, QString的正确使用/修改
- QString::toStdString()在std::string析构函数上崩溃
- QString fromStdString 静态函数而不是构造函数