QJSEngine:打印到控制台

Dmi*_*ank 0 qt qjsengine console.log

我正在从QScriptEngine(已被弃用)转移到QJSEngine,我发现我无法使用print:

  QJSEngine engine;

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

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

  qDebug() << "val: " << val.toVariant();
Run Code Online (Sandbox Code Playgroud)

输出是:

error:  "ReferenceError: print is not defined"
Run Code Online (Sandbox Code Playgroud)

QScriptEngine它的作品.

然后,打印控制台的方式是什么QJSEngine?在文档中找不到任何内容.我尝试使用console.log,但console也没有定义.

Meh*_*olf 6

从Qt 5.6开始,解决方案变得更加容易:可以安装Javascript扩展.一个这样的扩展是控制台,它提供了一个print功能:

QJSEngine myEngine;
myEngine.installExtensions(QJSEngine::ConsoleExtension);
myEngine.eval("print(1 + 2)");
Run Code Online (Sandbox Code Playgroud)


小智 5

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
Run Code Online (Sandbox Code Playgroud)

jsconsole.cpp

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


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

void JSConsole::log(QString msg)
{
    qDebug() << "jsConsole: "<< msg;
}
Run Code Online (Sandbox Code Playgroud)

使用它

现在,您可以使用QJSEngine.newQObject在js引擎中创建代理对象.之后,将其添加到全局对象并使用它.

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

记录错误

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

if (result.isError())
{
    qDebug() << "result: " << result.property("lineNumber").toInt() << ":" << result.toString();
}
Run Code Online (Sandbox Code Playgroud)

PS:经过多年潜伏后的第一篇文章.我已经阅读了写好答案的提示,但如果我犯了一些错误/不好的事情,请告诉我.

愿代码与你同在