1

以下のエラーが発生しました

"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);」から値 (「結果」) を返すことです。ジャバスクリプトで。QtScript は (const QString &) は理解できるが (QString &) は理解できないようです。私が何を間違えたのか分かりますか?

haha.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;
}

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();
}
4

4 に答える 4

1

元の質問には 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 に返す場合、1 つの解決策は、次のバージョンに示すように、関数の戻り値の型として QVariantMap を使用することです。

QVariantMap sayHelloV4(const QString name, QString result);

C++ の戻り値内には、必要な数のデータを挿入できます。(名前、結果など)。ただし、必要なデータを取得するには、QML コードで戻り値を後処理する必要があります。

于 2016-04-08T22:50:11.153 に答える
0

js と Qt データ型の間のデータ変換は QScriptValue によって行われます。これは基本的に、スロット内の QString が渡された js 文字列ではないことを意味します。

参照を渡すだけでは魔法のようなことはできません。別の方法を考えてみてください。

たとえば、最後のエラーを返す関数を追加できます。

于 2013-07-06T04:20:26.993 に答える
0

2 番目の引数にはQString&型がありますが、それは である必要がありますconst QString&

于 2013-07-02T06:42:34.513 に答える