Создание скриптуемых приложений
Qt поддерживает скриптинговую работу с приложениями с помощью JavaScript. Следующие руководства и справки охватывают аспекты программирования с JavaScript и Qt.
Классы для скриптинга
Следующие классы добавляют возможности скриптинга в приложения Qt.
Окружение для оценки JavaScript-кода |
|
Выступает в качестве контейнера для типов данных Qt/JavaScript |
|
Итератор в стиле Java для QJSValue |
Основные принципы использования
Для оценки скриптового кода вы создаете QJSEngine и вызываете его функцию evaluate(), передавая скриптовый код (текст) для оценки в качестве аргумента.
QJSEngine engine;
qDebug() << "the magic number is:" << engine.evaluate("1 + 2").toNumber(); Возвращаемое значение будет результатом оценки (представленным объектом QJSValue); его можно преобразовать в стандартные типы C++ и Qt.
Пользовательские свойства могут быть доступны скриптам путем регистрации их в движке сценариев. Это проще всего сделать, установив свойства глобального объекта движка сценариев:
engine.globalObject().setProperty("foo", 123);
qDebug() << "foo times two is:" << engine.evaluate("foo * 2").toNumber(); Это размещает свойства в среде сценариев, делая их доступными коду сценариев.
Доступ к объекту QObject для движка сценариев
Любой экземпляр, основанный на QObject, может быть сделан доступным для использования со скриптами.
Когда QObject передается функции QJSEngine::newQObject(), создается объект-оболочка Qt Script, который может быть использован для предоставления сигналов, слотов, свойств и дочерних объектов QObject скриптам.
Вот пример того, как сделать экземпляр подкласса QObject доступным для скриптового кода под именем "myObject":
QJSEngine engine;
QObject *someObject = new MyObject;
QJSValue objectValue = engine.newQObject(someObject);
engine.globalObject().setProperty("myObject", objectValue); Это создаст глобальную переменную, названную myObject в среде сценариев. Переменная служит прокси для базового объекта C++. Обратите внимание, что имя скриптовой переменной может быть любым; она не зависит от QObject::objectName().
Последствия для безопасности приложения
Модель безопасности скриптингового приложения с JavaScript соответствует той же модели, что и для кода C++: пользователь устанавливает доверенные скрипты для выполнения, так же как он устанавливает приложения Qt.
Чтобы сохранить доверие пользователей, разработчики приложений не должны оценивать произвольный JavaScript-код. Песочница движка JavaScript — это только семантический барьер. Скрипт оценивается в том же процессе и с теми же привилегиями, что и остальная часть приложения, и разделяет ту же память. Вследствие этого объекты C++, доступные для скриптов, доступны без дополнительных мер безопасности.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.15/qtjavascript.html