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也没有定义。

从Qt 5.6开始,解决方案更加简单:可以安装Javascript扩展。一个这样的扩展是提供print功能的控制台:

QJSEngine myEngine;
myEngine.installExtensions(QJSEngine::ConsoleExtension);
myEngine.eval("print(1 + 2)");

打印功能未在QJSEngine中实现。你必须自己实现它。幸运的是,您可以编写qobject并使其在脚本中可用。(参见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');");

错误日志

我在我的c++代码中搜索了很长时间的错误,当我刚刚在我的js文件中犯了拼写错误。下面的代码片段可以帮助避免这种情况。

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

PS:潜伏多年后的第一个帖子。我已经读了写好答案的技巧但是如果我犯了一些错误/不好的事情,请告诉我。

愿代码与你同在

相关内容

  • 没有找到相关文章

最新更新