From OpenSCADAWiki
Jump to: navigation, search
This page is a translated version of the page Modules/QTStarter and the translation is 100% complete.

Other languages:
English • ‎российский • ‎українська
Модуль Имя Версия Лицензия Источник Языки Платформы Тип Автор
QTStarter Qt GUI пускатель 5.8 GPL2 ui_QTStarter.so en,uk,ru,de x86,x86_64,ARM Пользовательские интерфейсы Роман Савоченко
Описание
Предоставляет Qt GUI пускатель. Qt-пускатель является единственным и обязательным компонентом для всех GUI модулей, основанных на библиотеке Qt.
  • Общая трудоёмкость: > 10 ЧД[!]
  • Спонсировано, реализации резервирования на 0.5 ЧД[!]: Хайди Рамезани
  • Сделать (To Do):
- реализовать менеджер подпроектов для их запуска в отдельных процессах, но с их хранением и управлением в одном конфигурационном файле проекта, для высоко-надёжных конфигураций;
- реализовать менеджер фонового исполнения процессов.

Модуль предоставляет в OpenSCADA пускатель GUI модулей, основанных на многоплатформенной библиотеке Qt графического пользовательского интерфейса (GUI), изначально созданной фирмой TrollTech. Также, модуль реализует элементы менеджера проектов OpenSCADA. Отдельный модуль для запуска Qt GUI модулей нужен ввиду необходимости организации однопотокового исполнения всех компонентов визуализации Qt и централизованной инициализации главного объекта Qt-библиотеки — QApplication.

1 Вступление

Изначально этот модуль создаёт отдельный поток для основного потока Qt, где есть возможность формирования экрана динамической заставки, поскольку основные задачи OpenSCADA продолжают исполнение в основном потоке. Однако версия Qt5 стала особенно чувствительной к исполнению в неглавном потоке, поэтому для неё в OpenSCADA добавлена такая возможность, но с обновлением сообщений в заставке из сервисного потока до и после момента переключения на исполнение ним первичных задач. Для контроля этой возможности предусмотрен параметр запуска --QtInNotMainThread, который включает исполнение в неглавном потоке, для Qt4, соответственно, по умолчанию, осуществляется исполнение в главном, что типично для Qt5.

Fig.1. Динамический экран заставки модуля.

Диалоговое окно пускателя (Рис.2) в общем предоставляет:

  • выбор присутствующих Qt GUI модулей, может отсутствовать в случае первичного запуска для выбора только проекта OpenSCADA;
  • выбор присутствующих OpenSCADA проектов для их выбора или переключения;
  • выход из OpenSCADA;
  • меню помощи с пунктами: "Про", "Про Qt", "Руководство QTStarter" (F1), "Руководство OpenSCADA 0.9" и "Что это" (Shift+F1).
Рис.2. Диалоговое окно пускателя этого модуля.

В случае отсутствия диалогового окна запуска и всех окон модулей Qt GUI, программа может быть запущена или свёрнута в системный лоток (Рис.3), созданный этим модулем.

Рис.3. Проект "АГЛКС", запущенный или свёрнутый в системный лоток.

Модулем осуществляется отключение функции сохранения сеанса программы при принудительном закрытии системой, для того чтобы предотвратить попытки восстановления этого сеанса при старте системы, поскольку OpenSCADA этого не нужно.

Модулем предусматривается поддержка эмуляции правой клавиши мыши для окружений с сенсорным экраном, вроде Android, поскольку интерфейс часто предусматривает контроль исключительно с помощью контекстного меню. Эмуляция включается установкой параметра командной строки --simulRightMKeyTm=<tm>, при старте программы, где указывается время удержания (типично две секунды) нажатия левой клавиши мыши (или на экране) для генерации сообщения правой клавиши мыши и контекстной помощи. Эмуляция правой клавиши не выключает-откладывает первичных сообщений левой клавиши, соответственно её общие действия должны работать корректно, но возможны несоответствия в местах где первичное сообщение что-то переключает и эмулированное сообщение уже пойдёт не по адресу!

2 Qt модули OpenSCADA

Для запуска Qt GUI модулей используется расширенный интерфейс вызова функций модулей. Данный интерфейс подразумевает экспортирование функций внешними модулями. В нашем случае Qt GUI модули должны экспортировать следующие функции:

  • QIcon icon(); — передаёт объект иконки вызываемого модуля, для построения перечня.
  • QMainWindow *openWindow(); — создаёт объект главного окна данного Qt GUI модуля и передаёт его пускателю. Может возвращать NULL в случае невозможности создания нового окна.

Для идентификации, Qt GUI модуль должен определять информационный элемент модуля "SubType" как "Qt". Исходя из этого признака "Пускатель" с ним работает.

После получения объекта главного окна "Пускатель" его просто отображает, а окно модуля может само дополнительно добавить элементы "Пускателя", в виде общего перечня Qt модулей OpenSCADA, для их вызова из этого окна. Общий перечень Qt модулей OpenSCADA может добавляться в меню или панель инструментов окна, путём вызова слота "makeStarterMenu(QWidget *mn = NULL)" класса QApplication от "Пускателя", где в mn указывается виджет контейнера действий (QAction), или меню главного окна, для NULL.

Для указания Qt GUI модулей, которые запускаются при старте, модуль стартера содержит конфигурационное поле "StartMod". В этом поле записываются идентификаторы модулей, которые запускаются. Конфигурационное поле "StartMod" можно определить в конфигурационном файле, а также в системной таблице БД ("SYS") через диалог конфигурации модуля (рис.4).

В случае закрытия окон всех Qt GUI модулей или запуске без определения модуля для запуска в поле "StartMod", "Пускатель" создаёт собственное диалоговое окно (рис.2). Если поле "CloseToTray" конфигурационного файла или конфигурацией модуля (рис.4) установлено то в этом случае осуществляется сворачивание программы в системный лоток (рис.3).

3 Проекты OpenSCADA

С интеграцией в OpenSCADA элементов менеджера проектов этот модуль получил функцию выбора существующих и создания новых проектов OpenSCADA, в списке проектов и команд проектов (рис.2). На данный момент предусмотрено два режима диалогового окна пускателя (рис.2), это — режим первичного-инициирующего запуска и режим исполнения выбранного проекта.

Первичный-инициирующий режим, по факту, является режимом запуска без определённого проекта и предусматривает именно выбор проекта для переключения в другой режим, и соответственно прячет список Qt GUI модулей, даже если они загружены в инициирующую конфигурацию.

В режиме исполнения проекта работают все типовые механизмы, а именно это вызов Qt GUI модулей и запуск-сворачивание в системный лоток, а диалоговое окно пускателя (рис.2) содержит перечень присутствующих Qt GUI модулей и информацию про запущенный проект, в заголовке окна.

В перечне проектов пользователю (через контекстное меню) дополнительно предоставляется возможность удалить неисполняемые проекты, зарезервировать — создать резервную копию, и восстановить проекты из выбранной резервной копии.

Кроме непосредственно названий проектов в перечне проектов, справа от названия, приведено их состояние — "текущий", "выполняется" и "{N} рез.копий". Состояние "текущий" означает, что осуществляется исполнение именно этого проекта. Состояние "исполняется" указывает на наличие файла блокирования множественного запуска, а соответственно и исполнения проекта, и отдельно от этого проекта если рядом не указано состояние "текущий". Выбрать и попробовать переключиться на проект в состоянии "исполняется" можно, приняв предупреждение, но если этот проект реально сейчас исполняется и наличие файла блокировки не является остаточным после аварийного завершения программы то программа, которая переключается, просто завершится! Состояние "{N} рез.копий" указывает на наличие указанного количества резервных копий проекта.

4 Вид и ощущение

В связи с расширением границ использования OpenSCADA на мобильные программные платформы вроде Maemo, MeeGo, Android и частых случаев несоответствия вида программ на библиотеках Qt4 и Qt5 к современным окружениям рабочего стола, этот модуль был расширен собственным механизмом контроля вида и ощущений конечного визуального интерфейсу.

В целом модуль сейчас предусматривает контроль за общим: стилем виджетов Qt, общим шрифтом, палитрой интерфейса и таблицами каскадных стилей. Этот контроль осуществляется через параметры конфигурационного файла "Style", "Font", "Palette", "StyleSheets" и конфигурацией модуля (рис.4).

Также, модулем предусмотрено оформление наработок отдельных видов и ощущений в библиотеке композитного характера, которая формируется в таблице конфигурационного файла со структурой: LookFeel(NAME, FONT, STYLE, PALETTE, STL_SHTS).

Т.е., для мобильных устройств или наперёд известных специфических окружений рабочего стола, нужный вид и ощущения можно предварительно устанавливать в конфигурационном файле пакетов программы, и для всех можно быстро изменить после установки, выбрав нужный из библиотеки.

5 Конфигурация

Для конфигурации функций, которые приведены выше, модулем предоставляется возможность настройки их параметров посредством интерфейса управления OpenSCADA (Рис.4):

  • Секция "Опции модуля":
    • Модули Qt для запуска.
    • Сворачивать или запускать в системный лоток.
  • Секция "Вид и ощущения", изменения тут не применяются сразу и требуют перегрузки:
    • Известные профили — комбобокс с перечнем профилей в библиотеке и перечень команд над текущим профилем:
      • "<Очистить>" — очистить текущий профиль;
      • "<Прочитать назад>" — прочитать профиль из текущих настроек Qt, только в очищенные элементы профиля.
      • "{Имя профиля}" — прочитать значение с указанного именем профиля и добавить-скомбинировать с текущим, если он не пустой.
    • Стиль виджетов — поле профиля, предусматривает возможность выбора из перечня известных в этой конфигурации Qt и не является композитным.
    • Общий шрифт — общий шрифт Qt, который также определяет размер иконок.
    • Палитра — поле профиля цветов интерфейса в трёх группах по строкам: активная, выключенная, неактивная. И с двадцатью цветами в группе-строке, разделённые символом ',': WindowText(0), Button(1), Light(2), Midlight(3), Dark(4), Mid(5), Text(6), BrightText(7), ButtonText(8), Base(9), Window(10), Shadow(11), Highlight(12), HighlightedText(13), Link(14), LinkVisited(15), AlternateBase(16), NoRole(17), ToolTipBase(18), ToolTipText(19). Профиль допускает определение только нужных цветов, оставляя неопределённые пустыми, и именно это определяет композитность палитры, а именно — заполнение пустот другим профилем библиотеки.
    • Страницы стилей — поле профиля каскадных таблиц стилей (CSS), композитность которого заключается в добавлении CCS правил в конец текущего профиля.
Рис.4. Страница конфигурации модуля.

6 API программирования пользователя

Объект модуля (SYS.UI.QTStarter)

  • Array sensors() — получить все доступные сенсоры от Qt mobility, возвращает "false" если не доступно ни одного сенсора.