如何在 QScriptEngine 中定义“窗口”对象

How to define the `window` object in QScriptEngine

本文关键字:窗口 对象 定义 QScriptEngine      更新时间:2023-10-16

JavaScript window对象

在 JavaScript 中,浏览器有一个全局对象window。这个对象有一些有趣的优点:

var any = 5;
console.log(window.any);

window对象充当命名空间,其中所有变量都在其中创建。

使用Qt QScriptEngine时,此行为(默认情况下(不处于活动状态,Qt是一个通用JS引擎,没有这些浏览器的特定功能。

问题是:

如何让QScriptEngine拥有这个window对象?(具有类似的行为(


尝试

假设一个简单的C++项目包括Qt(当前为 5.7(,下面的代码解析了一些 JS 并显示结果:

#include <QDebug>
#include <QScriptEngine>
#include <QCoreApplication>
//Logger class, for console.log
class Logger: public QObject
{
    Q_OBJECT
public:
    Logger( QObject*parent = nullptr): QObject(parent) {}
public slots:
    void log(const QString& str){ qDebug() << str; }
};
#include "test.moc"
int main(int argn, char* args[])
{
    QCoreApplication app(argn, args);
    QScriptEngine engine;
    // Logger
    Logger logger;
    QScriptValue loggerResult = engine.newQObject(&logger);
    engine.globalObject().setProperty("console", loggerResult);
    // TODO CONFIG HERE FOR WINDOW OBJECT
    //engine.globalObject().setProperty(QString("window"), 
    //    engine.newObject()); //Does not work, obviously
    engine.evaluate("var test=42; console.log(test); console.log(window.test)");
    if (engine.hasUncaughtException()) 
    {
        int line = engine.uncaughtExceptionLineNumber();
        QScriptValue error = engine.uncaughtException();
        QStringList errorStr = engine.uncaughtExceptionBacktrace();
        qDebug() << "Exception at:" << line << ":" << error.toString();
    }
}

输出:

"42">
"">

您可以将

this分配给window变量:

engine.evaluate("window=this; var test=42; console.log(test); console.log(window.test)");

输出:

"42">
"42">

Qt Blog中有一篇关于在QtScript中伪造Web浏览器环境的博客文章。