我从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
也未定义。
答案 0 :(得分:6)
从Qt 5.6开始,解决方案变得更加容易:可以安装Javascript扩展。一个这样的扩展是控制台,它提供print
功能:
QJSEngine myEngine;
myEngine.installExtensions(QJSEngine::ConsoleExtension);
myEngine.eval("print(1 + 2)");
答案 1 :(得分:5)
QJSEngine中未实现打印功能。你必须自己实现它。幸运的是,您可以编写QObject并在脚本中使用它们。 (参见&#34; QObject Integration&#34; http://doc.qt.io/qt-5/qjsengine.html)
以下是我的表现:
创建一个继承自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');");
我刚刚在我的cs文件中发现拼写错误时,我的c ++代码中出现了错误。以下片段可以帮助避免这种情况。
if (result.isError())
{
qDebug() << "result: " << result.property("lineNumber").toInt() << ":" << result.toString();
}
PS:经过多年潜伏后的第一篇文章。我已经阅读了关于撰写优秀答案的提示,但如果我犯了一些错误/不好的事情,请告诉我。
代码可以随身携带