QtScript可以't调用参数类型为“”的函数;Q字符串&&”;
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字符串。
传递引用不能起到神奇的作用,只需考虑其他方式。
例如,您可以添加一个返回最后一个错误的函数。
- 如何在JavaScript中将字符串转换为函数引用
- jQuery中是否内置了任何字符串格式化函数
- JavaScript按钮/输入/函数,字符串反转
- 推荐在JavaScript中执行存储为字符串的函数,而不是使用eval
- 从带参数的字符串变量调用函数中的函数
- 是否可以像字符串一样/操作/函数
- 从字符串调用javascript函数
- jquery字符串变量上的每个函数
- 如何在只接受字符串值/文字的HTML属性中调用函数
- 将JSON字符串转换为函数参数
- 在Javascript中将字符串转换为函数
- 正在创建使用子字符串解析JSON数据的函数
- 是否可以在 ng-click 中调用函数字符串
- 用于查找函数字符串 javascript 的正则表达式
- Regex js解析函数字符串
- 是传递给函数(字符串或对象)的元素
- 如何在不使用eval()的情况下将完整的函数字符串转换为javascript函数
- javascript函数字符串slice
- 引用函数(字符串)javascript中的数组项
- JS regex从一个函数字符串中提取多行参数