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++.