QJSEngine: печать на консоль

Я переезжаю из 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 также не определено.

2 ответа

Решение

Функция печати не реализована в QJSEngine. Вам придется реализовать это самостоятельно. К счастью, вы можете написать QObjects и сделать их доступными в вашем скрипте. (См. Раздел "Интеграция с QObject" на http://doc.qt.io/qt-5/qjsengine.html).

Вот как я это сделал:

Создайте класс JSConsole, наследующий от QObject:

Ваш собственный класс консоли

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

Используй это

Теперь вы создаете прокси-объект в движке js, используя QJSEngine.newQObject. После этого вы добавляете его в свой глобальный объект и используете его.

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

Регистрация ошибок

Я долго искал ошибки в своем коде C++, когда я только что сделал орфографическую ошибку в моем файле js. Следующий фрагмент помог бы избежать этого.

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

PS: первый пост после долгих лет. Я читал советы по написанию отличных ответов, но если я сделал несколько ошибок / плохих вещей, пожалуйста, сообщите мне.

Пусть код будет с вами

Начиная с Qt 5.6, решение стало еще проще: можно установить расширения Javascript. Одним из таких расширений является консоль, которая обеспечивает print функция:

QJSEngine myEngine;
myEngine.installExtensions(QJSEngine::ConsoleExtension);
myEngine.eval("print(1 + 2)");
Другие вопросы по тегам