QJSEngine:打印到控制台

QJSEngine: print to console

我正在从 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的方法是什么?在文档中找不到任何内容。我尝试使用 console.log,但 console 也未定义。

QJSEngine中没有实现打印功能。您必须自己实施。幸运的是,您可以编写 QObjects 并使它们在您的脚本中可用。 (参见 http://doc.qt.io/qt-5/qjsengine.html 的 "QObject Integration" 部分)

这是我的做法:

创建一个 class 继承自 QObject 的 JSConsole:

你自己的主机class

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: 第一个 post 经过多年的潜伏。我已经阅读了 关于编写出色答案的提示,但是如果我做了一些 mistakes/bad 事情请告诉我。

愿代码与你同在

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

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