Есть в Qt такой модуль, который уже с 5-й версии является deprecated и полноценной замены ему, по моему мнению, пока не предвидится. Я говорю, конечно же, о Qt Script и его использовании для реализации скриптов со стороны пользователя .
Перед тем как начать, замечу, что в документации Qt сейчас перечислено три способа встраивания возможностей для скриптования своего приложения.
Последний из них - QML, использует ставший сейчас основным QJSEngine и используется в первую очередь для реализации GUI.
Второй из них - QJSEngine, недостатки которого будут приведены ниже.
Ну и Qt Script. Сейчас он помечен как deprecated, вплоть до текущей версии Qt (пока 5.7) а значит, возможно, будет удален в будущем. Пока, правда, об удалении ничего не слышно, а авторы говорят, о том, что он deprecated, так как готов и больше не обновляться не будет.
QML - здесь все понятно: отдельный язык, но всё же, иногда не хочется отказываться от привычного C++. К тому же, паттерны работы довольно сильно отличаются от той манеры, которая привычна со скриптовым движком.
QJSEngine - не может считаться полноценной заменой Qt Script, так как:
Почему же Qt Script остался не удел, а заменой ему стало такое решение? Ответ на этот вопрос можно посмотреть здесь . Есть ещё архивный топик в gmane, который подробно раскрывал вопрос, но он перестал быть доступен в связи со смертью самого gmane.
Вкратце, как я понял, ставка была сделана на более простой и быстрый API, который бы мог использоваться в том числе и в анимациях. Кроме этого были проблемы с тем, что были доступны некоторые низкоуровневые вещи, которые сильно мешали разработчикам при замене внутреннего JS-движка на другой.
Почему в QJSEngine забыты такие мелочи как timeout скрипта и константные свойства? На этот вопрос ответа все же найти не удалось.
Что же остается делать в случае удаления Qt Script? Пока видится только два варианта:
Перед тем как начать, замечу, что в документации Qt сейчас перечислено три способа встраивания возможностей для скриптования своего приложения.
Последний из них - QML, использует ставший сейчас основным QJSEngine и используется в первую очередь для реализации GUI.
Второй из них - QJSEngine, недостатки которого будут приведены ниже.
Ну и Qt Script. Сейчас он помечен как deprecated, вплоть до текущей версии Qt (пока 5.7) а значит, возможно, будет удален в будущем. Пока, правда, об удалении ничего не слышно, а авторы говорят, о том, что он deprecated, так как готов и больше не обновляться не будет.
QML - здесь все понятно: отдельный язык, но всё же, иногда не хочется отказываться от привычного C++. К тому же, паттерны работы довольно сильно отличаются от той манеры, которая привычна со скриптовым движком.
QJSEngine - не может считаться полноценной заменой Qt Script, так как:
- Нет таймаута на исполнение скриптов и его нельзя никак прервать, как было в QtScript
- В нем нет возможности сделать константные объекты и свойства, сравните: QScriptValue::setProperty и QJSValue::setProperty
Почему же Qt Script остался не удел, а заменой ему стало такое решение? Ответ на этот вопрос можно посмотреть здесь . Есть ещё архивный топик в gmane, который подробно раскрывал вопрос, но он перестал быть доступен в связи со смертью самого gmane.
Вкратце, как я понял, ставка была сделана на более простой и быстрый API, который бы мог использоваться в том числе и в анимациях. Кроме этого были проблемы с тем, что были доступны некоторые низкоуровневые вещи, которые сильно мешали разработчикам при замене внутреннего JS-движка на другой.
Почему в QJSEngine забыты такие мелочи как timeout скрипта и константные свойства? На этот вопрос ответа все же найти не удалось.
Что же остается делать в случае удаления Qt Script? Пока видится только два варианта:
- Оставаться на старой версии Qt 4/5 - приемлемо в течении некоторого времени, но рано или поздно миграция станет проблемой
- Заменять Qt Script на какой-то другой язык скриптования - во втором случае, помимо других вопросов, встает вопрос о том, как сделать автобиндинг свойств и методов классов, производных от QObject.
Проблема во втором варианте решается относительно через составление списков методов и свойств через QMetaFramework и использованием QMetaProperty и QMetaMethod . Поэтому, пока второй метод кажется предпочтительным с точки зрения правильности. Но и ничего не делать тоже можно - всё же, с момента как он стал deprecated прошло уже три года, а воз и ныне там...
Комментариев нет:
Отправить комментарий