Аннотация: Изучаются выджеты - визуальные элементы, из которых состоит графический интерфейс пользователя, их компоновка, политика размеров, сигнально-слотовые соединения, элементы графического интерфейса и их использование.
Виджеты (Widgets ) - это визуальные элементы, из которых состоит графический интерфейс пользователя.
Примеры виджетов:
В Qt есть около 50-ти готовых классов графических элементов доступных для использования. Родительским классом для всех виджетов является класс QWidget . От него наследуются все главные свойства визуальных элементов, которые мы тщательно рассмотрим. Исследование способов разработки программ с графическим интерфейсом начнём с примера.
Создадим пустой файл проекта. Запустим мастера проектов и выберем в разделе Projects (Проекты) пункт Other Project (Другой проект) . Далее выберем тип проекта Empty Qt Project (Пустой проект Qt) . К файлу проекта добавим содержимое:
TEMPLATE = app #Модули Qt, которые мы будем использовать QT += widgets #Добавляем модуль widgets для работы с виджетами (необходимо для Qt5). TARGET = widget#Название исполняемого файла SOURCES += \ main.cpp
Теперь создадим простую программу с окном, в котором мы будем выводить надпись. Установим размер окна и текст его заголовка, а также установим шрифт для надписи. Для этого создадим файл main.cpp со следующим содержанием:
#include
Как видим, элементы, из которых состоят интерфейсы в Qt , имеют собственные позицию и размер - так называемую "геометрию" - и, таким образом, занимают соответствующую прямоугольный участок на экране (см. рис. 13.1). Также каждый из элементов имеет настройки, которые определяют его поведение и вид.
Рис.
13.1.
Для создания структуры виджеты организовывают в иерархию по принципу "часть - целое". Каждый из виджетов может содержать другие виджеты. Такой визуальный элемент становится "родителем" (родительским виджетом) для элементов, которые он содержит. Отметим, что такие отношения не следует путать с наследованием в C++ - отношениями между классами в программе. Отношения между виджетами являются отношениями между объектами. Такие отношения порождают несколько последствий:
Виджеты, которые не имеют родителя (виджеты верхнего уровня), имеют вид отдельных окон в программе. Рассмотрим пример. Назовём новый проект ParentExample . Файл проекта будет содержать обычные для GUI -проекта настройки:
TEMPLATE = app TARGET = ParentExample QT += widgets
Для виджета, который мы будем использовать в качестве главного окна создадим новый класс. Для этого в категории Files and Classes (Файлы и классы) выберем раздел С++ и выберем С++ Class (см. рис. 13.2).
Следующим шагом будет создание нескольких элементов на окне. Для этого откроем файл parentwidget.cpp и изменим код конструктора класса. Для отображения элементов достаточно создать их в конструкторе класса и задать ParentWidget как отца для них. Код parentwidget.cpp выглядит так:
#include " parentwidget.h "
#include
Поскольку родительским элементом является ParentWidget , то метка (QLabel ), кнопка (QPushButton ) и текстовое поле (QLineEdit) находятся в его пределах. Позицию дочерних виджетов задают относительно левого верхнего угла отца. В этом легко убедиться изменив размеры и позицию окна нашей программы. Обратите внимание на то, как мы создавали элементы пользовательского интерфейса в динамической памяти используя оператор new . Это гарантирует, что элементы не будут удалены после завершения работы конструктора ParentWidget .
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
Когда впервые в 1959 г. на конференции UNESCO по обработки информации г. Стречи предложил режим разделения времени при решении задач на компьютерах - с этого момента принято отсчитывать начало интерактивных вычислений и, следовательно, исследование человеко- машинного интерфейса. По мере роста мощности компьютеров росли и затраты на диалоговую компоненту программного обеспечения. Вопрос эффективности использования машин обострился во время стремительного выхода на рынок рабочих станций, объединивших интерактивность с графикой. Термин эффективность с тех пор изменил свое значение - если раньше он отражал такие характеристики как процессорное время и объем занимаемой памяти, то теперь под ним понимают простоту разработки, легкость сопровождения и удобство работы с программой. Поэтому затраты на исследование и разработку пользовательского интерфейса являются оправданными.
Разработка любого прикладного программного обеспечения, как правило, подразумевает создание пользовательского интерфейса. Поскольку большинство современных пользовательских интерфейсов основываются на аналогичных идеях (активное использование "мышки", ориентированность на объекты, графика и т.д. - имитация процессов и явлений, возможность использования алгоритмов, знакомых каждому человеку из его обыденной жизни), то существует возможность и необходимость разработки вспомогательного программного обеспечения, предназначенного для создания такого рода "стандартных" интерфейсов, точнее их базисов.
С другой стороны, много- и разнообразие аппаратных и системных платформ, на которых должно будет работать это программное обеспечение, требует его переносимости на уровне исходного кода. Вышеизложенные требования логически приводят к идее переносимого унифицированного программного инструментария для создания пользовательских интерфейсов или, если рассматривать конечный прикладной программный продукт, системы (модуля, блока), которая ведает (заведует, заправляет, обслуживает, управляет) интерфейсом с пользователем.
Особенностью X Window является её архитектура - она построена по схеме клиент--сервер. Взаимодействие X-клиента и X-сервера происходит в рамках соответствующего протокола прикладного уровня - X-протокола. X Window безразличен используемый транспорт, которым может быть служить как локальный UNIX -socket, так и любой сетевой, например, TCP. Это означает, что X-клиент и X-сервер могут "проживать" и на разных компьютерах, т.е. программа может осуществлять ввод-вывод графической информации на экране другого компьютера, причём, различия в архитектуре X- клиента и X-сервера не играют никакой роли - это обеспечивается стандартом X- протокола. Система обеспечивает графический вывод на экран машины, воспринимает сигналы от устройств ввода, таких, как клавиатура и мышь, и передаёт их программам. Следует отметить, что устройство вывода может иметь более одного экрана. X обеспечивает вывод на любой из них. Всё это: экран (экраны), устройства ввода (клавиатура, мышь) называется в терминах X Window - дисплей.
X позволяет пользователю (за дисплеем) общаться со многими программами одновременно. Чтобы вывод из них не смешивался, система создаёт на экране дисплея "виртуальные подэкраны" - окна. Каждое приложение (как правило) рисует только в своём окне (или своих окнах). X предоставляет набор средств для создания окон, их перемещения по экрану, изменения их размеров, вывода в них и т.п.
Как правило, программы имеют набор конфигурационных параметров - ресурсов. Это может быть цвет окна, различные параметры текстового шрифта (лигатура, кегль, etc.) и многое другое. Система стандартизует способ задания ресурсов приложений, управления ими, и содержит ряд процедур для работы с ними. Эта совокупность функций называется "менеджер ресурсов" (Xrm - X resource manager). "Хранилище" параметров программы называется базой данных ресурсов.
X функционирует согласно идеологии управляемости событиями (event-driven architecture) - она организует общение между самими программами и между программами и внешней средой посредством событий. Событие есть единица информации, идентифицирующая происходящие в системе изменения или действия. По идентификатору события можно получить информацию о нём - вид события, его характеристики, где оно произошло и т.п..
Система X Window представляет собой совокупность программ и библиотек. "Сердцем" её является специальная программа - X-сервер. Это отдельный UNIX -процесс, имеющий место быть на компьютере, к которому присоединён дисплей. Именно сервер знает особенности конкретной аппаратуры, знает, что надо предпринять, чтобы вывести какой-либо графический объект, например, примитив, на экран. Он же умеет воспринимать и обрабатывать сигналы, приходящие от клавиатуры и мыши.
Сервер общается с программами-клиентами, посылая им или принимая от них пакеты данных. Если сервер и клиент находятся на разных машинах, то данные посылаются по сети, а если на одном, - то используется внутренний канал. Например, если сервер обнаруживает, что пользователь нажал кнопку мыши, то он подготавливает соответствующий пакет (событие) и посылает его тому клиенту, в чьём окне находился курсор мыши в момент нажатия кнопки. И наоборот, если программе надо вывести что-либо на экран дисплея, она создаёт необходимый пакет данных и посылает его серверу. Очевидно, описание этого взаимодействия, форматов пакетов и т.п. и составляет спецификацию вышеупомянутого X-протокола.
Однако, чтобы программировать для X, совсем необязательно знать детали реализации сервера и X -протокола. Система предоставляет стандартную библиотеку процедур, с помощью которых программы осуществляют доступ к услугам X "на высоком уровне". Так, для того, чтобы вывести на экран точку, достаточно вызвать соответствующую стандартную процедуру, передав ей требуемые параметры. Эта процедура выполнит всю работу по формированию пакетов данных и передаче их серверу.
Окна могут располагаться на экране произвольным образом, перекрывая друг друга. X Window имеет набор средств, пользуясь которыми, программа-клиент может изменять размеры окон и их положение на экране. Особенностью системы является то, что она не имеет встроенной возможности управлять окнами с помощью мышки или клавиатуры. Чтобы это можно было осуществить, нужен специальный клиент - менеджер окон (window manager).
Однако, менеджер не может корректно управлять окнами, ничего о них не зная. Окна могут обладать различными свойствами, которые должен обеспечивать именно менеджер окон: например, во многих случаях удобно иметь заголовки окон, в других - желательно, чтобы окно нельзя было сделать меньше, или наоборот - больше, определённого размера. Окно может быть "схлопнуто" в пиктограмму ("иконку") - в этом случае менеджер должен знать, какую пиктограмму использовать и как её назвать. Клиенты могут сообщать менеджеру свои пожелания относительно окон двумя способами:
Система X Window предназначена для работы на растровых дисплеях. Число бит на пиксель называют глубиной или толщиной дисплея. Биты с одинаковыми номерами (одинаковые двоичные разряды) во всех пикселях образуют как бы плоскость, как бы параллельную экрану. Её называют цветовой плоскостью. X позволяет рисовать в любой цветовой плоскости (-ях), не затрагивая остальные.
В X Window встроены средства для обеспечения информацией между программами- клиентами. Для этого используется механизм "свойств" (properties). "Свойство" - это информационная структура, связанная с некоторым объектом, например, окном, доступная всем клиентам X. Каждое свойство имеет имя и уникальный идентификатор - атом. Обычно, имена свойств записываются большими буквами. Атомы используются для доступа к содержимому свойств с тем, чтобы уменьшить объём информации, пересылаемой между клиентами и X сервером.
Чтобы облегчить программирование в системе X window, было создано несколько пакетов. Стандартом де-факто в настоящее время является библиотека X Toolkit Intrinsics (Xt), которая входит в комплект стандартной поставки системы. Xt упрощает инициализацию программ и создание окон. Кроме того, библиотека содержит средства для создания объектов (управляющих элементов), используемых программами при общении с пользователями. В терминах Xt управляющий элемент называется widget.
В настоящий момент на основе пакета реализованы различные наборы (множества) управляющих элементов (объектов), например, Athena, OSF/Motif, Open Look. Эти наборы в совокупности с самой Xt применяются в качестве удобного инструмента для создания интерфейсов. Они берут на себя рутинную работу, которую при написании собственного приложения с использованием только процедур базовой библиотеки X Window программисту пришлось бы выполнить вручную.
Пакет Xt представляет собой базу для создания управляющих элементов - widget-ов (заготовок). В смысле Xt widget - это просто структура данных, поля которой включают идентификатор самого элемента, идентификатор его окна, если таковое имеется, и многое другое. Атрибуты такого объекта называются ресурсами. Ресурсами widget могут быть, например, цвет его окна, цвет границы окна, шрифт выводимого текста и т.д.
Во время работы программа создаёт сами объекты (экземпляры классов -- widget). Они образуют совокупности, каждая из которых также представляет некоторую иерархию. Каждая такая иерархия называется деревом объектов (widget tree). Корнем дерева обязательно является widget, принадлежащий к одному из подклассов специального класса - Shell. Если среди двух widget A и B дерева объектов первый ближе к корню, чем второй, то A является родительским объектом ("родителем") для B, а B - подобъектом (или "дочерним" объектом (потомком)) для A. Таким образом, shell -объект является родительским widget для всех остальных widget данного дерева объектов. Именно он осуществляет взаимодействие программы и менеджера окон.
Описанная иерархия widget соответствует взаимосвязи их окон, что является свойством X Window. Кроме этого, на объекты накладывается и другая иерархия. Дело в том, что во время работы одни объекты могут управлять другими. Например, если некий объект имеет подобъекты, то при изменении геометрии он может автоматически перестроить геометрии своих потомков. Чтобы это могло осуществиться, между widget устанавливается связь - связь "по управлению". Каждый объект может иметь один или несколько "управляемых" им подобъектов.
Процедуры ("процедуры обратного вызова"). Для любого класса определена совокупность действий, на которые должны реагировать принадлежащие ему объекты. Например, для любого класса предусмотрена реакция на уничтожение widget. Когда действие производится, происходит вызов либо стандартной функции Xt, либо одной или нескольких процедур, предоставляемых программой. Такие функции и называются сallback -процедурами или просто callback.
Программы, работающие в X, должны выполнить ряд стандартных действий, как то: установить связь с сервером, задать необходимые свойства для менеджера окон, и ещё множество других шагов. Если используется Xt, то всё это делается одной процедурой - XtInitialize(). Она инициализирует сам пакет, менеджер ресурсов ({\term resource manager) X Window, и выполняет другие необходимые операции. Обращение к XtInitialize() (или XtAppInitialize()) должно предшествовать всем другим вызовам процедур Xt. XtInitialize() возвращает идентификатор shell-widget, который может использоваться как корень дерева объектов программы. Как правило, имя класса программы совпадает с именем самой программы, только начинается с заглавной буквы. Менеджер ресурсов использует имя и класс программы для поиска её параметров в базе данных ресурсов.
Каждая программа может задать в командной строке некоторые параметры. В Xt определены "стандартные" параметры, которые могут быть переданы при запуске программы. Кроме этого, в командной строке могут присутствовать и нестандартные параметры, свойственные только данному приложению. XtInitialize() сканирует командную строку и размещает соответствующие значения данных в базе данных.
При инициализации создаётся также и контекст программы - структура, которая хранит всю информацию о приложении. Контекст предназначен оградить программу от влияния различных модификаций в операционной системе. XtInitialize() создаёт некоторый стандартный контекст (default context), но, тем не менее, начиная с четвёртой версии X, рекомендуется создавать для каждого отдельного экземпляра программы отдельный "личный" контекст, для чего в терминах Xt следует использовать вызов процедуры XtAppInitialize() (вместо XtInitialize()). Заметим здесь, что приложение в Xt может иметь не одно, как обычно, а несколько объектов "верхнего уровня".
Следующим после инициализации является этап создания управляющих элементов программы, описания взаимоотношений между ними, задание реакций на различные события (регистрация обработчиков событий и других подобных объектов). Это может делаться разными способами, традиционным же является использование, например, для создания объекта процедуры XtCreateWidget(), для передачи управления объектом его родителю - процедуры XtManageChild(), для регистрации обработчиков событий для widget - процедуры XtAddEventHandler(), и т.д. и т.п.
Программа, использующая только процедуры основной X библиотеки (Xlib), должна сама рассматривать каждое приходящее событие (получая его из очереди событий явным вызовом, например, XNextEvent() или XPeekEvent()) и соответствующим образом реагировать на него. Если окон у задачи несколько, то, прежде чем производить какие-то действия, необходимо определить, в каком из окон произошло событие, и на каком уровне иерархии будет происходить обработка этого события (будет ли обрабатывать это событие данный объект или его родитель?). Всё это достаточно утомительно.
Xt берёт всю рутинную работу на себя. XtMainLoop() получает очередное событие и определяет окно, которому оно предназначено. По окну находится соответствующий widget. Для последнего определяются event handler, action -процедура или callback, зарегистрированные для реакции на произошедшее событие. Если таковые сеть, они вызываются. Описанный выше механизм называется рассылкой событий.
Каждый создаваемый программой widget есть представитель того или иного класса. Xt и пакеты, на нём основывающиеся, такие как OSF/Motif, Athena, Tk/tcl, Open Look, etc., имеют большое количество таких классов. Создание новых widget, не предусмотренных в стандартных библиотеках, требует и создания (определения) соответствующего класса, что, обычно, является трудоёмкой задачей.
OverrideShell. Это важный подкласс класса Shell. Для окна widget данного класса атрибут override_redirect устанавливается в значение True, т.е. менеджер окон его не контролирует. Как правило, окна объектов этого класса не имеют аксессуаров, добавляемых менеджером окон (заголовок, рамка, стандартные кнопочки), и используются в основном для создания меню различного типа.
TransientShell. Этот класс отличается от предыдущего только особенностями взаимодействия с менеджером окон. Окна widget данного класса не могут быть минимизированы (превращены в пиктограмму). Но если в пиктограмму превращается родитель объекта класса TransientShell, то окно widget убирается с экрана. Класс TransientShell используется для создания диалогов.
Xt поддерживает несколько способов работы с окнами widget. Так, программка, используя процедурки, предоставляемые Xt, может показать окошко, установить для него тот или иной режим работы, и закрыть окошко, когда оно становится ненужным. В основном эти процедуры используются для создания pop-up меню и диалогов. Как правило, все множества widget (например, OSF/Motif) имеют свои намного более удобные процедуры для создания меню и диалогов.
Кроме этого, Motif предоставляет специальный класс объектов, которые называются gadget - они образуют в Motif отдельный класс XmGadget, который является подклассом класса RectObj. Они также могут использоваться для создания интерфейсных элементов, но обладают особенностью - они не имеют собственных окон. Для рисования gadget пользуются окном своего родителя.
Motif имеет два основных подкласса объектов: XmPrimitive и XmManager (класс XmGadget поминался ранее). Оба этих класса являются абстрактными. Первый из них наследуется от класса Core и используется как базовый для классов объектов, не владеющих другими объектами. Примерами являются нажимаемые кнопки, списки и т.д. Класс XmManager наследуется от класса Constraint и применяется для создания объектов, которые могут иметь и управлять дочерними объектами.
Класс XmGadget. При создании экземпляров обычных классов объектов Motif (widget) порождается и соответствующее окно. Если программа использует много widget, то это приводит к значительному замедлению работы приложения. Время тратится и на создание окон, и на дальнейшую работу с ними. Но легко видеть, что наличие для каждого объекта отдельного окна совсем необязательно. Метки label, кнопки, да и многие другие widget с успехом могли бы использовать для рисования окна своих родительских объектов. Нет окна - не надо обращаться лишний раз к серверу, растёт производительность и не тратится дополнительная память.
Проводя именно эту идею в жизнь, разработчики Motif продублировали некоторые классы объектов, создав две версии - с окном и без окна. Версии объектов, не имеющие окон, ведут свою иерархию от абстрактного класса - XmGadget, и обобщающее название у них такое же. Этот специальный класс объектов наследует свои характеристики от класса RectObj, который, в свою очередь, есть абстрактный класс, заключающий в себе базовые механизмы управления геометрией объектов.
Кроме того, что gadgets не имеют собственных окон, на них накладываются и другие ограничения. Так, для них нельзя определить обработчики событий (event handler), таблицы трансляции. Кроме того, gadget не могут иметь объектов-потомков. В остальном функциональность gadget и соответствующих widget одинакова, поэтому описывать их отдельно мы не будем, только перечислим.
Представитель данного класса служит для создания так называемых "отмечаемых кнопок" (check button), которые мудрее было бы называть "галочками", и "радио-кнопок" (radio button) - многопозиционных переключателей. Первые служат для задания логических параметров, т.е. имеющих два значения. Вторые служат аналогичной цели, но множество значений в данном случае конечно и содержит более двух элементов. При этом форма графического представления объекта типа XmToggleButton зависит от того, используется ли он как "галочка" или "радио" кнопка.
XmList. Представители данного класса - это одни из наиболее интересных объектов Motif. Они предназначены для показа списка строк и дают пользователю возможность произвести различные действия с элементами списка. Пользователь может выбрать одну или несколько строк, представленных в этом объекте, при этом они подсвечиваются. Кроме того, если список имеет фокус ввода, то один из его элементов выделяется пунктирной рамкой. Эту рамку называют курсором списка.
XmScrollBar. Объекты данного класса - полосы прокрутки (скролл-бары), как правило, используются в совокупности с другими объектами, такими, как список (XmList), текст (XmText) и другими. Скролл-бар предназначен для прокрутки области, если представленная в ней информация (список, текст, рисунок и т.п.) не может быть показана в окне полностью. Объекты класса XmScrollBar представляют собой полосу (горизонтальную или вертикальную), по краям которой находятся кнопки со стрелками. Нажатие на какую-либо из них приводит к прокрутке в направлении указанном стрелкой. На самой полоске скролл-бара располагается ползунок (бегунок) - выделенный цветом прямоугольник. Если "зацепить" его мышью и "тащить", то это, как правило, также приводит к прокрутке области.
XmSeparator. Объекты данного класса - разделители - используются, как правило, в целях улучшения внешнего вида окон приложения. Такой widget представляет собой вертикальную или горизонтальную полоску (линию), разделяющую группы объектов. Например, разделители могут применяться в меню для отделения одних команд от других, в диалогах - обособляя группу нажимаемых кнопок от остальных элементов и т.д.
Для каждой дочерней widget можно указать, к чему привязан её левый, правый, нижний или верхний край. Так, если левый и правый края подобъекта привязать к правому краю формы, то расстояние от них до этого края всегда будет оставаться одним и тем же. Если размер формы уменьшится, то подобъект сдвинется влево, а если размер увеличится, то - вправо. Можно привязать один подобъект к другому. Тогда изменение положения подобъекта, к которому привязан widget, приведёт к перемещению привязанного объекта так, чтобы расстояние между ними сохранилось.
XmSelectionBox. Объекты данного класса ("блоки выбора") представляют пример составной widget и включают в себя прокручиваемый список, где пользователь может выбрать нужный ему элемент, а также текстовое поле (объект XmTextField), где отображается выбранный в списке пункт. Пользователь может редактировать сделанный выбор. Список и текстовое поле могут иметь поясняющие надписи, задаваемые с помощью соответствующих widget класса XmLabel. Объект класса XmSelectionBox включает также и три нажимаемые кнопки (объекты XmPushButton). По умолчанию на них нанесены надписи "Ok", "Cancel" и "Help". И, наконец, есть ещё один элемент - нажимаемая кнопка, имеющая по умолчанию название "Apply". Первоначально данный подобъект создаётся, но не включается в список управляемых (managed) widget.
Текстовое поле "Filter" задаёт маску (шаблон), для отбора из всего множества файлов некоторого подмножества, удовлетворяющих задаваемому в этом поле условию - подходящих под шаблон - именно это подмножество и показывается в списке "Files". В списке "Directories" отображаются поддиректории текущего каталога. В текстовом поле "Selection" отображается файл (его название), выбранный в списке "Files", и в это же текстовое поле пользователь может ввести и полное имя нужного ему файла вручную. Четыре нажимаемые кнопки используются для осуществления различных действий:
XmMessageBox. Объекты данного класса предназначены для выдачи пользователю сообщений, возникающих в процессе работы программы. Этот widget является составным. Он имеет область, в которой отображается строка текста (сообщение) и специальная пиктограмма, характеризующая тип сообщения. Кроме этого, в объекте есть три нажимаемых кнопки. По умолчанию на них нанесены надписи: "Ok", "Cancel" и "Help".
XmDrawingArea. Объекты данного класса предоставляют программе окно для рисования и отображения информации. В самом классе не предусмотрены параметры, которые можно было бы непосредственно применять для вывода графики. Но имеющиеся в этом классе списки сallback -процедур позволяют получать извещения о необходимости перерисовки окна widget и о получении фокуса ввода.
XmPanedWindow. Объекты данного класса могут объединять разнородные widget. Подобъекты отделяются друг от друга, и между ними помещается специальный элемент, который имеет название sash. Он выглядит, как маленький квадрат, и используется для изменения размеров дочерних widget. Так, если объект класса XmPanedWindow имеет два подобъекта, то можно проделать следующее: "зацепить" sash мышкой и "оттащить" его в нужную сторону (вниз-вверх или влево-вправо) - при этом продольный размер (размер вдоль направления, в котором был "оттащен" sash) одного дочернего объекта увеличится "за счёт" другого (размер другого уменьшится), поперечные размеры обоих подобъектов сохранятся. "Поперечный" размер объекта класса XmPanedWindow определяется максимальным аналогичным размером его подобъектов.
XmScrolledWindow. Объект данного класса предоставляет возможность выводить и просматривать некоторую информацию (текст, рисунок, список). Такой widget, как правило, содержит подобъект, в котором расположены данные, предназначенные для просмотра (это может быть объект класса XmText, XmDrawingArea и др.) Для более удобного просмотра данных могут использоваться горизонтальные и вертикальные полосы прокрутки.
Как уже упоминалось при описании Xt, класс TransientShell используется для создания объектов программы, которые, с одной стороны, непосредственно контактируют с менеджером окон, а с другой стороны, имеют особенности, отличающие их от обычных окон верхнего уровня. Основной из этих особенностей является та, что widget класса TransientShell нельзя минимизировать. Но они убираются с экрана, если в пиктограмму превращается родитель. Такого рода widget, как правило, используются для создания вспомогательных окон программы.
Тэги (метки) предназначены для того, чтобы сделать программы независимыми от конкретных шрифтов, задаваемых пользователем. Делается это следующим образом: приложение создаётся так, что во всех функциях, работающих со строками текста, присутствуют не сами шрифты, а их метки. Когда задача скомпилирована и стартует, определяется соответствие между тэгами и конкретными шрифтами. Последние и используются для рисования.
Кроме этих моделей передачи и получения фокуса ввода существует ещё механизм передачи фокуса ввода от одной widget к другой. Объекты могут быть объединены в группы - это может делаться заданием необходимых значений соответствующих ресурсов, а может быть отдано на откуп системе. В последнем случае Motif автоматически связывает widget, используя встроенные правила. Так, например, объект класса XmMessageBox содержит три группы: одна - "основной" объект диалога (класс XmForm), вторая - "метка", в которой представлено сообщение пользователю, третья - нажимаемые кнопки.
Передача фокуса внутри группы производится с помощью клавиш стрелок, а от группы к группе - с помощью клавиши табуляции (поэтому сами группы называют Tab -группами). При передачи фокуса группе, фокус ввода в ней передаётся первому объекту, который может получить фокус (объекту можно запретить получать фокус, установкой подобающего значения соответствующего ресурса). Порядок передачи фокуса ввода внутри группы совпадает с порядком, в котором созданы её widget. При этом, обычно, комбинация клавиш перемещает фокус в противоположном направлении.
Язык tcl имеет простой синтаксис, программировать на нём легко. В исходном своём виде tcl - это интерпретатор. Позволяет создавать новые конструкции, как функции или программы, что предоставляет умелому программисту мощный инструмент разработки не только конечных приложений, но и своего собственного расширения языка tcl, создания и поддержки своего собственного стиля.
Библиотека tcl предоставляет возможность использовать в прикладных программах интерпретаторы языка tcl, а значит и включать в программы скрипты, написанные на командном языке tcl. Библиотека содержит лексический анализатор языка tcl, функции, реализующие встроенные команды tcl, позволяет пристраивать пользовательские подпрограммы (вызовы функций) к командам tcl. Такая компоновка возможна и для C, и для C++.
Tk представляет собой Motif -совместимый инструментарий (toolkit) для разработки графических пользовательских интерфейсов в среде X Window. В дополнение к стандартному интерфейсу с C и C++, он включает интерфейс с tcl, предоставляя возможность использовать средства Tk из среды интерпретатора команд tcl. Это означает, что помимо стандартного программирования на C и C++, интерфейсные части приложения могут быть реализованы в виде скриптов на языке tcl и эти интерфейсные части (диалоги, планировки экранов и т.д.) можно править динамически, в ходе работы конечной программы, используя команды tcl.
Системы программирования и их графические возможности. Разработка мультимедиа курса, способствующего эффективному усвоению учащимися базовой школы темы "Графические возможности языка программирования" (на примере языков программирования Basic и Pascal).
дипломная работа , добавлен 29.12.2010
Графические компоненты экрана, системные объекты и функции. Система средств взаимодействия пользователя с устройством. История графических пользовательских интерфейсов персональных компьютеров, их классификация. Оконная система X Window System.
презентация , добавлен 22.05.2012
Программирование и простейшие графические возможности. Основные структуры для представления и два конструктора с аргументами. Дальнейшие координаты точки и инициализирование новой. Хранение и изменение координат левого верхнего угла прямоугольника.
лабораторная работа , добавлен 01.12.2011
Векторная компьютерная графика. Графические примитивы. Графические возможности языка программирования Pascal. Методические рекомендации к изучению графики в языке программирования Pascal. Построение графиков функций.
курсовая работа , добавлен 13.06.2007
Разработка программы для операционной системы Windows с использованием VisualC++ (6.0, .NET). Рассмотрение основ программного моделирования работы прибора (электрического чайника). Правила создания классов устройства и его графического интерфейса.
курсовая работа , добавлен 03.06.2014
Компьютерная графика. Представление графической информации в компьютере. Графические форматы. Графические редакторы. Векторная графика. CorelDraw. Характеристика программы, интерфейса. Технологические возможности и использование программы CorelDraw.
курсовая работа , добавлен 19.05.2007
Роль распределенных вычислительных систем в решении современных задач. Инструментальная система DVM для разработки параллельных программ. Средства построения формальной модели графического интерфейса. Требования к графическому интерфейсу DVM-системы.
курсовая работа , добавлен 15.10.2010
Сущность программирования с использованием среды Delphi 7 и ее основные графические возможности. Структура автономно компилируемого программного модуля и его принципы. Основные приемы работы с графическими процедурами, построение дуги, круга и эллипса.
курсовая работа , добавлен 16.12.2011
Сферы применения машинной графики. Виды компьютерной графики. Цветовое разрешение и цветовые модели. Программное обеспечение для создания, просмотра и обработки графической информации. Графические возможности текстовых процессоров, графические редакторы.
контрольная работа , добавлен 07.06.2010
Эволюция графических пользовательских интерфейсов. Устройство системы X Window и менеджеры окон. Описание рабочего стола и приложения KDE и GNOME. Обзор основных принципов организации интерфейса в системе Windows, описание пакета ее прикладных программ.
yadobr 14 января 2014 в 09:10
Однако далеко не все разработчики и даже дизайнеры, задумываются о создании удобного и понятного графического интерфейса пользователя.
Для себя я начал с постановки вопросов: общие принципы, какие элементы интерфейса(ЭИ)
создать, какой у них должен быть дизайн, где их правильно размещать и как они должны себя вести.
Ниже я постараюсь ответить на эти вопросы.
Правило 2: уменьшить нагрузку на пользователя
Правило 3: сделать интерфейс совместимым
Руководящие принципы
Программа "Tidy Start Menu"
Заключение
Литература
"Золотое правило проектировщика гласит: "Никогда не делай другим того, что они сделали тебе". Вспомните, что вам не нравится в программном обеспечении, которым вы пользуетесь. И не делайте того же самого в программе, над которой работаете."
Трэйси Леонард
Программное обеспечение должно разрабатываться с учетом требований и пожеланий пользователя - система должна подстраиваться к пользователю. Вот почему принципы проектирования столь важны.
Пользователи компьютера могут иметь удачный опыт, который внушит им уверенность в своих силах и укрепит высокую самооценку при работе с компьютером. Их действия с компьютером могут быть охарактеризованы как "успех порождает успех". Каждый позитивный опыт общения с программой позволяет пользователю расширять область знакомства с программным обеспечением и повышать свой уровень компетентности. Хорошо продуманный интерфейс, подобно хорошему учителю и учебникам, обеспечивает плодотворное взаимодействие пользователя и компьютера. Удачные интерфейсы даже способны помочь человеку выйти из привычного круга программ, которыми он пользуется, и открыть новые, углубить понимание работы интерфейсов и компьютеров.
Принципы разработки интерфейса - это высокоуровневые концепции и представления, которые могут использоваться при проектировании программного обеспечения. Нужно определить, какой из принципов наиболее важен и приемлем для вашей системы.
Приступая к проектированию, необходимо выделить важнейший принцип, который будет определяющим при поиске компромиссов. Попытка соблюсти все принципы проектирования может привести к тому, что в некоторых ситуациях это не оправдает себя и отрицательно скажется на конечном результате. Принципы - это руководство к действию.
Три принципа разработки пользовательского интерфейса формулируются так:
1)контроль пользователем интерфейса;
2)уменьшение загрузки памяти пользователя;
3)последовательность пользовательского интерфейса.
Хансен представил первый список принципов проектирования. Принципы таковы:
1)знать пользователя;
2)сократить запоминание;
3)оптимизировать операции;
4)устранить ошибки.
Многие крупные производители операционных систем, выпусти на рынок свои новые продукты, публикуют соответствующие руководства и инструкции. В этих изданиях раскрываются принципы подхода к проектированию интерфейса. Руководства выпускали Apple Computer, Inc. (1992), IBM Corporation (1992), Microsoft Corporation (1995) и UNIX OSF/Motif (1993).
Читатели могут использовать названные публикации как пособие при обучении. Терминология по интерфейсу в разных руководствах может отличаться, но адресация материала, уровень сложности и описанные принципы пользовательского интерфейса едины для всех книг.
"Несовместимость интерфейса может стоить большой компании миллионов долларов убытка из-за потери продуктивности и увеличения стоимости технической поддержки." - Джесси Брист.
Эти принципы применимы ко всему программному и аппаратному обеспечению, во всех типах и стилях интерфейсов. Вырабатывались они на протяжении довольно длительного времени: производились изыскания в области программного интерфейса, осуществлялись разработки, опрашивались пользователи многих компьютерных платформ, в том числе Macintosh и PC.
Данные принципы выдержали проверку временем и появлением новых компьютерных технологий. Якоб Нильсен заметил: "Принципы останутся основополагающими даже если программа будет иметь футуристичный трехмерный дизайн с печаткой "DataGlove", служащей для ввода, будут распознаваться движения и "живые" видеоизображения. Они будут актуальны, поскольку выражают основную идею диалога с машиной при помощи команд".
Трактовка этих принципов будет зависеть от аппаратного обеспечения, операционной системы, составляющих пользовательского интерфейса и его задач. Зачастую деловое решение довлеет над использованием принципов проектировщиками. Пользовательские модели и модели проектировщика также различны и влияют на то, как будут применяться принципы. На некоторых важных этапах разработки проекта может встать вопрос: "Что произойдет далее?". Ответ должен быть таким: "Что захочет пользователь!".
Решение о выборе оптимальных принципов построения интерфейса должно вырабатываться совместно всеми членами команды по проектированию. Эти решения должны способствовать улучшению покупаемости и развитию программных продуктов.
"Делай это проще, но не примитивнее."
Альберт Эйнштейн
Опытные проектировщики позволяют пользователям решать некоторые задачи по собственному усмотрению. Архитекторы по завершении строительства сложного комплекса зданий должны проложить между ними дорожки для пешеходов. Пока они не знают, в каком именно месте люди будут пересекать площадки. Поэтому дорожки никогда не прокладывают одновременно с возведением зданий. На площадках между домами помещаются таблички с надписью: "Пожалуйста ходите по траве". Через некоторое время строители возвращаются и только теперь, согласно "волеизъявлению" населения, заливают протоптанные дорожки асфальтом.
Принципы, которые дают пользователю контроль над системой:
1)использовать режимы благоразумно;
2)предоставить пользователю возможность выбирать: работать либо мышью, либо клавиатурой, либо их комбинацией;
3)позволить пользователю сфокусировать внимание;
4)демонстрировать сообщения, которые помогут ему в работе;
5)создать условия для немедленных и обратимых действий, а также обратной связи;
6)обеспечить соответствующие пути и выходы;
7)приспосабливайте систему к пользователям с различным уровнем подготовки;
8)сделать пользовательский интерфейс более понятным;
9)дать пользователю возможность настраивать интерфейс по своему вкусу;
10)разрешить пользователю напрямую манипулировать объектами интерфейса;
Режимы - не всегда плохо. Надо позволить человеку самому выбирать нужные ему режимы. Интерфейс должен быть настолько естественным, чтобы пользователю было комфортно работать с ними. Пользователь не думает о переключении в режим вставка или перезаписи при работе в текстовом процессоре - это вполне рационально и естественно.
Возможность работы с клавиатурой использование клавиатуры вместо мыши. Это значит, что пользователю будет легче работать, просто он либо не может ею пользоваться, либо ее у него нет. Панели инструментов созданы, чтобы ускорить работу при использовании мыши. Однако при работе с клавиатурой до них нельзя добраться - для подобных случаев предусмотрены "выпадающие" меню.
Не вынуждать пользователей заканчивать выполнение начатых последовательностей действий. Дать им выбор - аннулировать или сохранить данные и вернутся туда, где они прервались. Пусть у пользователей останется возможность контролировать процесс работы в программе.
Во всем интерфейсе использовать понятные для пользователя термины. Они не обязаны знать о битах и байтах!
Следует выбрать правильный тон в сообщениях и приглашениях. не менее важно застраховаться от проблем и ошибок. Неудачная терминология и не правильный тон приведут к тому, что пользователи будут винить себя в возникающих ошибках.
Каждый программный продукт должен включать в себя функции UNDO и REDO. Необходимо информировать пользователя о том, что данное действие не может быть отменено, и по возможности разрешить ему альтернативное действие. Постоянно держать человека в курсе происходящего в данный момент.
Пользователи должны получать удовольствие при работе с интерфейсом любого программного продукта. Даже интерфейсы, применяемые в индустрии, не должны пугать пользователя, он не должен боятся нажиматься нажимать кнопки или переходить на другой экран. Вторжение Internet показало, что навигация - основная интерактивная техника в Internet. Если пользователь понимает, как зайти на нужную страницу в WWW, то существует 80-процентная вероятность, что он разберется в интерфейсе. Люди осваивают методы работы с браузером очень быстро.
Не "жертвовать" опытными пользователями во благо обычных. Надо предусмотреть для них быстрый доступ к функциям программы. Не утомлять их прохождением многочисленных шагов для выполнения какого-либо действия, если они привыкли пользоваться одной макрокомандой.
Пользовательский интерфейс - "мифическая" часть программного продукта. При хорошем проекте пользователи даже не ощущают его "присутствия". Если он разработан неудачно, пользователям придется приложить даже немало усилий для эффективного использования программного продукта. Задача интерфейса - помочь людям почувствовать себя находящимся как бы "внутри" компьютера, свободно манипулировать и работать с объектами. Это и называется "прозрачным" интерфейсом!
Предоставлено Салимом Гулом (Saleem Gul) и Томасом Павеком (Tomas Pavek)
В данном учебном курсе рассматривается создание простого графического интерфейса пользователя и добавление к нему несложной серверной функциональности. В частности, будет рассмотрен код, определяющий поведение кнопок и полей в форме Swing.
Мы разберем компоновку и структуру графического интерфейса, после чего добавим несколько кнопок и текстовых полей. Текстовые поля предназначены для получения вводимой пользователем информации и вывода результата работы программы. Кнопка будет инициировать работу функций, встроенных в клиентскую часть программы. Создаваемое приложение представляет собой простой, но полнофункциональный калькулятор.
Более детальное руководство по функциям разработки конструктора графического интерфейса пользователя, включая видеодемонстрации различных функций разработки см. в разделе .
Предполагаемая продолжительность: 20 минут
Первым действием является создание проекта среды IDE для разрабатываемого приложения. Дадим проекту имя NumberAddition .
Для продолжения процесса создания интерфейса необходимо создать контейнер Java, в который будут помещены другие требуемые элементы графического интерфейса. В этом действии контейнер будет создан с помощью элемента JFrame . Контейнер будет помещен в новый пакет, который будет отображаться в узле "Source Packages".
Среда IDE создает форму NumberAdditionUI и класс NumberAdditionUI в приложении NumberAddition и открывает форму NumberAdditionUI в GUI Builder. Пакет my.NumberAddition заменяет собой пакет по умолчанию.
Далее с помощью окна "Palette" внешний интерфейс приложения заполняется панелью JPanel. После этого добавляются три элемента JLabel (текстовые подписи), три элемента JTextField (текстовые поля) и три элемента JButton (кнопки). Если до этого работа с конструктором графического интерфейса пользователя не выполнялась сведения о размещения компонентов см. в разделе Разработка графического пользовательского интерфейса Swing в IDE NetBeans .
После перетаскивания и размещения указанных выше элементов элемент JFrame должен выглядеть так, как показано на рисунке ниже.
Если в правом верхнем углу среды IDE отсутствует окно Palette ("Палитра"), выберите Window ("Окно") > Palette ("Палитра").
На этом этапе будет выполнено переименование элементов, которые были добавлены к элементу JFrame.
Теперь готовый графический интерфейс должен выглядеть так, как показано на рисунке ниже:
В этом упражнении будет добавлена необходимая функциональность к кнопкам "Add", "Clear" и "Exit". Поля jTextField1 и jTextField2 будут использоваться для ввода значений пользователем, а jTextField3 - для вывода результата работы программы. Создаваемая программа представляет собой простейший калькулятор. Итак, приступим!
Для того чтобы кнопки стали функциональными, каждой из них необходимо присвоить обработчик событий, который будет отвечать за реагирование на события. В нашем случае требуется идентифицировать событие нажатия кнопки - путем щелчка мышью или с помощью клавиатуры. Поэтому будет использоваться интерфейс "ActionListener", предназначенный для обработки событий "ActionEvent".
Этот код удаляет текст из всех трех полей JTextField, оставляя их пустыми.
Кнопка "Add" должна выполнять три действия.
Теперь программа полностью готова, и можно приступить к ее сборке и выполнению.
Для выполнения программы в среде IDE выполните следующие действия:
Примечание. При открытии окна с указанием того, что для Project NumberAddition не задан основной класс, следует выбрать my.NumberAddition.NumberAdditionUI в качестве основного класса в том же окне и нажать кнопку ОК.
Для запуска программы вне среды IDE выполните следующие действия:
Через несколько секунд приложение запустится.
Примечание. Если при двойном щелчке файла JAR не выполняется запуск приложения, дополнительные сведения о настройке связей файлов JAR в используемой операционной системе см .
Можно также запустить приложение из командной строки.
Для запуска приложения из командной строки выполните следующие действия:
Примечание. Убедитесь, что my.NumberAddition.NumberAdditionUI задан как основной класс до запуска приложения. Для провери этого, щелкните правой кнопкой узел мыши узел проекта NumberAddition на панели "Проекты", выберите "Свойства" во всплывающем меню и выберите категорию "Выполнить" в диалоговом окне "Свойства проекта". В поле "Основной класс" должно отображаться my.numberaddition.NumberAdditionUI .
В этом руководстве было рассмотрено реагирование на простое событие нажатия кнопки. Существует множество событий, на которые может реагировать приложение. Просмотреть в среде IDE список доступных событий, которые могут обрабатываться элементами графического интерфейса, можно следующим образом:
Как выполняется обработка событий? При каждом выборе события из меню событий среда IDE автоматически создает так называемый прослушиватель событий и связывает его с компонентом разработчика. Для более подробного ознакомления с процессом обработки событий выполните следующие действия.
В этом месте к элементу графического интерфейса, в данном случае к jButton3 , добавляется объект прослушивания событий "ActionListener". Интерфейс "ActionListener" имеет метод "actionPerformed" объекта "ActionEvent", который реализуется путем простого вызова обработчика событий jButton3ActionPerformed . Теперь эта кнопка реагирует на события действий. Каждый раз при нажатии кнопки создается событие "ActionEvent", которое передается в метод "actionPerformed" интерфейса прослушивания событий, исполняющий код, предусмотренный разработчиком для этого события в обработчике событий.