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)");