QT QJSENGINE导入JS文件



是否可以在qjsengine(qt 5.6)中导入javascript文件?

示例1:

plaintextedit中的文字:

.import "./jsimport.js" as Test
var x = Test.y;
console.log(x);

c :

void MainWindow::on_pushButton_clicked()
{
    QJSEngine engine;
    engine.installExtensions(QJSEngine::AllExtensions);
    QJSValue result = engine.evaluate(ui->plainTextEdit->toPlainText());
    qDebug() << "isError:" << result.isError();
    qDebug() << "resultString:" << result.toString();
    if(result.hasProperty("lineNumber"))
        qDebug() << "property lineNumber:" << result.property("lineNumber").toInt();
}

jsimport.js文件中的文本:

var y = 42;

结果:

isError: true
resultString: "ReferenceError: Test is not defined"
property lineNumber: 2

示例2:

plaintextedit中的文字:

.import "./jsimport.js"

相同的C 代码

结果:

isError: true
resultString: "SyntaxError: File import requires a qualifier"
property lineNumber: 1

似乎导入有一些功能,因为最后一个错误。

在新的QT版本中,import可以在QJSEngine中使用。

使用ECMA-262/ES6语法代替QML领先点语法:

import { Test } from "./jsimport.js"
var x = Test.y;
console.log(x);

./jsimport.js

export Test = {
  y: 54
}

我相信,这可能是QT5.12中升级到ES6和ES7的一部分的添加的。

  • JavaScript引擎现在支持Ecmascript 7.这包括对Ecmasipript 6的升级,请参见Ecmascript 6-新功能:概述&amp;比较。
  • eCmascript模块现在可以直接使用qjsengine :: importModule()加载,并在使用.mjs文件扩展名时导入.qml文件。

正如它所说的,您也可以使用::importModule()从C 侧预加载/初始化ES6模块。

.import语句不适用于qjsengine。QJSengine只是一个裸露的解释器,如果您想具有一些"导入"功能,则可以切换到QQMLENGINE,该功能是在QJSengine顶部构建的:http://doc.qt.io/qt-5/qtqml-syntax-imports.html#qml-import-path

使用QJSengine,您基本上需要手动填充JS全局对象(QTCreator Sintax Checker将无法识别您在不同文件中使用的语句)。

相关内容

  • 没有找到相关文章

最新更新