0

QScriptEngine(非推奨) からに移行していQJSEngineますが、 を使用できないことがわかりましたprint:

  QJSEngine engine;

  QJSValue val = engine.evaluate(
        "print('123');"
        );

  if (val.isError()){
     qDebug() << "error: " << val.toString();
  }

  qDebug() << "val: " << val.toVariant();

出力は次のとおりです。

error:  "ReferenceError: print is not defined"

そのQScriptEngine中で動作します。

では、コンソールに何かを印刷する方法は何QJSEngineですか? ドキュメントで何も見つかりません。を使用しようとしましconsole.logたが、console同様に定義されていません。

4

2 に答える 2

5

QJSEngineには印刷機能は実装されていません。自分で実装する必要があります。幸いなことに、QObjects を記述して、スクリプトで使用できるようにすることができます。( http://doc.qt.io/qt-5/qjsengine.htmlの「QObject 統合」セクションを参照)

これが私がやった方法です:

QObject から継承するクラス JSConsole を作成します。

独自のコンソール クラス

jsconsole.h

#ifndef JSCONSOLE_H
#define JSCONSOLE_H

#include <QObject>

class JSConsole : public QObject
{
    Q_OBJECT
public:
    explicit JSConsole(QObject *parent = 0);

signals:

public slots:
    void log(QString msg);
};

#endif // JSCONSOLE_H

jsconsole.cpp

#include "jsconsole.h"
#include <QDebug>


JSConsole::JSConsole(QObject *parent) :
    QObject(parent)
{
}

void JSConsole::log(QString msg)
{
    qDebug() << "jsConsole: "<< msg;
}

それを使用する

QJSEngine.newQObjectを使用して、js エンジンでプロキシ オブジェクトを作成します。その後、それをグローバル オブジェクトに追加して使用します。

QJSEngine engine;
JSConsole console;
QJSValue consoleObj =  engine.newQObject(&console);
engine.globalObject().setProperty("console", consoleObj);
QJSValue result = engine.evaluate("console.log('test');");

エラーロギング

js ファイルでスペルミスをしたときに、C++ コードのエラーを長い間検索してきました。次のスニペットは、それを回避するのに役立ちました。

if (result.isError())
{
    qDebug() << "result: " << result.property("lineNumber").toInt() << ":" << result.toString();
}

PS: 何年も潜んでいた後の最初の投稿。素晴らしい回答を書くためのヒントを読みましたが、間違いや悪いことをした場合は教えてください。

コードがあなたと共にありますように

于 2015-09-04T21:44:26.577 に答える