Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Управление графическим интерфейсом с поддержкой echo и cat

Anna | 24.06.2014 | нет комментариев

Некогда я заинтересовался вопросом о том, каким образом дозволено было бы создавать пользовательский интерфейс программ и познакомился с Qt Designer — утилиты для разработки графических интерфейсов, которая входит в типовой состав Qt.

Помимо каждого прочего Qt Designer впечатлил своей способностью сберегать все формы в файлах формате XML, которые могут теснее в последствие подключаться непринужденно в программу.

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

Пока не отпустило, нужно было неотложно придумывать как такое дозволено провернуть.

OpenForm

И так возник на свет концепт OpenForm — создание и управление формами с поддержкой командной строки.

Где основная идея основывается на том, что всякое состояние интерфейса дозволено представить в формате XML.

Значит если я хочу отрисовать форму, мне необходимо каждого лишь какая-то утилита, которая возьмет на себя непринужденно задачу отображения форм, а каждая логика будет на стороне.
Другими словами, требуется такой мини Qt Designer, тот, что прочитает изложение форм и виджетов, и это дело теснее отобразит. А Дабы поменять состояние интерфейса, необходимо легко как-то передать программе новое изложение, скажем, в виде XML.

Вот и получается, что OpenForm сперва читает файл изложения форм, отрисовывает их, и вешает на заданные события определенные триггеры, т. е. действия.
Если событие случается, скажем кто-то куда-то кликнул, то выполняется какое-то действие. А действие — это ничто иное как исполнение какой-то внешней программы, которая должна возвратить новое состояние пользовательского интерфейса.

А сейчас по пунктам.
1. Qt Designer сберегает дизайн в виде *.ui файлов формата XML.
2. OpenForm читает эти файлы и отображает.
3. На определенные события вешаются триггеры.
4. Если событие случилось, то выполняется сторонняя команда либо программа, которая должна воротить новое состояние интерфейса, т. е. вывести XML новой версии дизайна на стандартное устройство итога.

Мануал

OpenForm работает с *.ui файлами, которые создаются в среде Qt Designer.

<ui version="4.0" >
  <class>MainWindow</class>
  <widget name="MainWindow">
  <property name="windowTitle">
    <string>MainWindow</string>
  </property>
  </widget>
</ui>

И помимо дефолтных способностей легко отобразить форму, владеет еще и дополнительными плюшки.

Решетки комментируют

Для тех, кто фигачит, комментарии штука дюже необходимая, если не сказать нужная.

<ui version="4.0" >
  <class>MainWindow</class>
  <widget name="MainWindow">
  # This is a comment
  <property name="windowTitle">
    <string>MainWindow</string> # title of window
  # <string>MainWindow changed</string> # unneeded title
  </property>
  </widget>
</ui>
Разделяй и подключай

Полный комплект для тех, кого не отпускает: знакомая директива для препроцессора #include.
Сейчас дозволено интерфейс разделять на модули.

По обычии, если *.ui исполняемые файлы, то заголовочные обязаны быть как *.hui

file: geometry.hui:

<property name="geometry" >
  <rect>
    <x>0</x>
    <y>0</y>
    <width>800</width>
    <height>600</height>
   </rect>
</property>

file: widget.ui:

<ui version="4.0" >
  <class>MainWindow</class>
  <widget name="MainWindow">
  <property name="windowTitle">
    <string>MainWindow</string>
  </property>
  #include "geometry.hui"
  </widget>
</ui>
События, сигналы и триггера

Самое значимое, ради чего мы здесь все собрались: вероятность контролировать состояние пользовательского интерфейса с поддержкой сторонней программы через командную строку.

<triggers>
  <trigger object="btnSubmit">
    <event signal="clicked">cat update_widget.uui</event>	
  </trigger>
</triggers>

Это обозначает, что если пользователь нажмет на кнопку с именем btnSubmit, выполнится команда
cat update_widget.uui, выводящая содержимое файла с новым состоянием интерфейса.

<triggers>
  # Триггер для объекта с именем OBJECT_NAME
  <trigger object="OBJECT_NAME">
    # Список событий над нынешним объектом.
    #   signal: типовой Qt сигнал
    #   action: тип триггера
    #     "execute" - COMMAND должна быть исполнена, и возвратить новое состояние интерфейса в XML
    #     "return"  - COMMAND должна быть выведена на стандартное устройство итога
    <event signal="SIGNAL" action="execute|return">COMMAND</event>
  </trigger>
</triggers>

action=return нужен, когда требуется спросить что-то у пользователя либо узнать состояние интерфейса из внешней программы, которая вызывает OpenForm (смотри пример с диалоговым окном).

Доставай и обрабатывай

OpenForm владеет еще одним необычайной вероятностью приобретения значения свойств виджетов. Т.е. если нужно узнать, что там пользователь напечатал в поле ввода, то дозволено пользоваться конструкцией {WIDGET_NAME.PROPERTY_NAME}

Скажем

<event signal="clicked">php script.php —user-input={lineEdit.text}</event>

Где {lineEdit.text} — это обозначает, что из виджета lineEdit возвратить значение свойства с именем text. Если пользователь что-то введет, то это дозволено передать стороннему скрипту.

То же самое работает и для булевых свойств.

<event signal="clicked">php script.php --checked={checkBox.checked}</event>

Возвратит true либо false.

Экранирование

Если нужно применять { в командах, то дозволено легко написать так \{

Точечное обновление

Если триггер возвратит дизайн в виде

<ui version="4.0">
...
</ui>

то форма снова перерисуется.
Но в случаях, когда не требуется снова пересоздавать форму, а необходимо легко обновить состояние одного элемента, дозволено применять :

<update>
...
</update>
И, наконец, управление графическим интерфейсом с поддержкой echo

Вот и подошли к вопросу, каким же таким методом дозволено руководить графическим интерфейсом с поддержкой утилиты echo.

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

<event signal="clicked">echo "[[update]]
[[widget name='label']]
[[property name='text']]
[[string]]{lineEdit.text}[[/string]]
[[/property]]
[[/widget]]
[[/update]]"
</event>

По событию нажатия, выполнится команда echo, где [[ заменится на <, а ]] — на >. Итогом будет копирование текста из поля ввода lineEdit в объект label.

Ну и для чего все это нужно?

Ну, скажем, помощник при установки программного обеспечения:

Рис 1. Шаг лицензионного соглашения.


Рис 2. Пример анимации, прогресс бара.

Дозволено даже легко о чем-то спрашивать сурового пользователя с поддержкой графических форм.

Рис 3. Диалоговое окно с ожиданием действия от пользователя.

Работает дальнейшим образом:

#!/bin/bash
an=`./dialog.ui`
if [ $an = 'yes' ]; then
    echo 'There should be real installation of something very cool'
else
    echo 'Ok, we will do nothing...'
fi

Ну или… а может, написать графический калькулятор на баше.

Рис 4. Графический калькулятор с обработкой выражений на баше.

Либо даже так:

Рис 5. Графический калькулятор на PHP.

 

Источник: programmingmaster.ru

 

Оставить комментарий

Ваш email не будет опубликован. Обязательные поля помечены (обязательно)

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2014 © BB3x.ru - русская поддержка форума phpBB