gpt4 book ai didi

javascript - QtScript 无法调用参数类型为 "QString &"的函数

转载 作者:太空宇宙 更新时间:2023-11-04 14:05:02 26 4
gpt4 key购买 nike

我遇到了以下错误

"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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com