Qt Script: Введение

Qt Script

В Qt предусмотрен мощный механизм расширения функциональности приложений с помощью JavaScript-подобного языка сценариев, поддержка которого реализована в модуле Qt Script.

Рассмотрим пример использования этой технологии, в котором задействуем следующие возможности Qt Script:

  1. Считывание и запись свойств Qt-объектов;
  2. Установление соединения между сигналом и слотом Qt-объектов;
  3. Создание функции-слота внутри скрипта и его подключение к сигналу Qt-объекта.

Мы обеспечим доступ скрипта к полям ввода/вывода ( QLineEdit). Для редактирования скрипта предусмотрим текстовое поле QTextEdit. При этом в ресурсах приложения мы поместим три заранее подготовленных простых скрипта, о которых скоро поговорим.

Реализация

Обратите внимание , что для работы с Qt Script в файле проекта необходимо подключить соответствующую зависимость в дополнение к остальным:

Файл mainwidget.h:

В основе Qt Script лежит класс QScriptEngine, который и занимается интерпретацией кода скрипта. Именно его мы определили в качестве одного из полей нашего класса.

Файл mainwidget.cpp:

Особый интерес представляет функция-член:

Сначала мы подчищаем следы запуска прошлых скриптов (отключаем сигналы и очищаем содержимое поля вывода). Затем следует вызов скрипта с помощью QScriptEngine::evaluate(). В случае синтаксических ошибок мы выводим текст сообщения о проблеме в поле вывода.

Также важно заметить, что скрипт не имеет прямого доступа к элементам Qt-приложения. Поэтому мы должны передать ему все, что нужно, самостоятельно. Что мы и делаем для полей ввода/вывода в конструкторе класса:

Теперь внутри скрипта к полю ввода можно обратиться по имени input, а к полю вывода по имени output.

Замечание: мы несколько превышаем потребности скрипта и даем ему больше, чем нужно. Например, скрипт сможет изменять содержимое поля input, хотя должен уметь только читать его. Но пока что не будем обращать на это внимания.

Примеры скриптов

Первый скрипт upper_demo.js копирует текст из input в output, преобразуя его к верхнему регистру:

Второй скрипт connect_demo.js выполняет соединение сигнала textChanged() поля input со слотом setText() поля output:

Запуск этого скрипта равносилен выполнению обычной привязки сигналов-слотов в Qt:

Последний скрипт connect_func_demo.js:

В нем мы определяем свою функцию onTextChanged(), которая принимает параметр text. В теле функции мы делаем то же самое, что и ранее в скрипте upper_demo.js.

Само подключение нашей функции в качестве слота аналогично тому, что мы делали в connect_demo.js.

Понравилась статья? Поделиться с друзьями:
Добавить комментарий