Qt QJSEngine импортирует файлы js

Можно ли импортировать файлы JavaScript в QJSEngine (QT 5.6)?

Пример 1:

Текст в обычном текстовом редакторе:

.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

Кажется, что есть некоторые функции для импорта из-за последней ошибки.

2 ответа

Решение

Оператор.import не работает с QJSEngine. QJSEngine - простой интерпретатор, если вы хотите иметь некоторую функциональность "импорта", вы можете переключиться на QQmlEngine, который построен поверх QJSEngine: http://doc.qt.io/qt-5/qtqml-syntax-imports.html

С QJSEngine вам в основном нужно вручную заполнять глобальный объект js (а программа проверки синтаксиса QtCreator не распознает операторы, которые вы используете в разных файлах).

В новых версиях Qtimportможет быть использован вQJSEngine.

Используйте синтаксис ECMA-262/ES6 вместо синтаксиса QML с начальной точкой:

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

./jsimport.js

      export Test = {
  y: 54
}

Я считаю, что это, вероятно, было добавлено как часть обновления до ES6 и ES7 в Qt5.12:

Как говорится, вы также можете использовать::importModule()для предварительной загрузки/инициализации модулей ES6 со стороны C++.

Другие вопросы по тегам