javascript — QtScript не может вызвать функцию с типом аргумента & quot; QString & amp; & quot;

Я получил ниже ошибки

"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») &имя, QString &результат); «в 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();
}

1

Решение

Ваш второй аргумент имеет QString& типа, но это должно быть const QString&,

0

Другие решения

Я не эксперт по JavaScript. Но после Google «вернуть значение через параметры в javascript» и «вернуть несколько значений в javascript». Но я не нашел стандарт сам.

Я думаю, что ваш способ получить возвращаемое значение в параметре невозможно. затем QString& здесь нет смысла.

Надеюсь, что другие могут научить или исправить меня на эту тему, спасибо.

0

Преобразование данных между js и типом данных Qt выполняется QScriptValue, в основном это означает, что QString в слоте не является строкой js, которую вы передали.

Передача ссылки не может творить чудеса, просто подумайте о другом.

Например, вы можете добавить функцию, которая возвращает последнюю ошибку.

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 должен постобработать возвращаемое значение, чтобы получить необходимые данные.

0
По вопросам рекламы [email protected]