Введение в разработку графических интерфейсов. Основы GTK+ Разработка GUI. 1 / 17.02.2011
←
→
Транскрипция содержимого страницы
Если ваш браузер не отображает страницу правильно, пожалуйста, читайте содержимое страницы ниже
Разработка GUI. 1 / 17.02.2011
Введение в разработку
графических интерфейсов.
Основы GTK+
http://cs.karelia.ru/~aborod/gui/
1Лабораторные и зачет
Период Срок защиты работы
14.02 — 27.02
28.02 — 13.03 (1) GTK+. Обработка событий, GUI
14.03 — 27.03 (2) GTK+. Меню, диалоги, панели
28.03 — 10.04 (3) Qt. Сигналы и слоты, виджеты GUI
11.04 — 24.04 (4) Qt. Использование MVC
25.04 — 08.05 (5) Qt. Графика
09.05 — 22.05 (6) Qt. Интернационализация
23.05 — 29.05 ЗАЧЕТ
2Графические интерфейсы?
● Элементы интерфейса в виде визуальных
объектов (виджетов), т. е. графических
изображений
● Произвольный доступ к всем видимым элементам
интерфейса посредством широкого спектра
устройств ввода
● Элементы интерфейса, используя метафоры,
несут информацию об их назначении, обеспечивая
обучение пользователя в процессе работы
(интуитивно понятный интерфейс)
3История развития
● Исследовательские разработки:
70-е: компьютер Alto (Xerox PARC)
WIMP = Windows. Icons, Menus, Pointing Device
● Коммерческий успех:
1981: Xerox 8010 Star IS
1983: Apple Lisa
1985: Atari ST
● Первые попытки упорядочить разработку GUI:
IBM Common User Access Specification
4Система XWindow
● отрисовка
графических
изображений
● поддержка
концепции окон
● унификация работы
с устройствами
● сетевой интерфейс
обмена данными
● клиент-серверная архитектура
5Развитие системы XWindow
● Менеджеры окон
– необходимо управлять окнами, фокусом,...
– менеджер окон не зависит от сервера!!!
– twm, mwm (Motif), etc.
● Концепция виджета
– В GUI используется типовой набор элементов
управления — виджетов (widget = window +
gadget)
– Система виджетов образует иерархию =>
GUI-библиотеки
6Использование Xlib, Xt, xev
● Типичная организация GUI-приложения:
– Создание интерфейса на основе набора виджетов
– Отслеживание событий X и реагирование
● Использование Xlib напрямую ограничено
сложностью API
● В Xt введено понятие абстракции основного цикла
● Для сборки используйте -lX11 -lXt
● Для изучения событий X используйте xev
7Высокоуровневые средства
● GTK+
– реализована на языке C
– основа для среды рабочего стола Gnome
● Qt
– реализована на языке C++
– основа для среды рабочего стола KDE
● wxWidgets
● FLTK
● ...
8Архитектура тулкита GTK+
GTK+
Glib
GDK
АТК Pango Gobject
GdkPixbuf
GIO
9Структура библиотеки GTK+
● GTK+
– иерархия виджетов
● GDK
– кроссплатформенные средства отрисовки и
управления окнами
● GDKPixbuf
– управление цветовыми картами изображений
● GLib
– обеспечивает структуры данных, макросы,
утилиты, абстракцию основного цикла и т.п.
10Структура библиотеки GTK+
● GObject
– объектно-ориентированный интерфейс к языку C
● Pango
– используется для интернационализации текстов
● ATK
– реализует средства для людей с ограниченными
возможностями
● GIO
– реализует VFS API
11Пример использования GTK+
Вопросы для обсуждения
● Какова общая схема приложения GTK+?
● Какова общая схема использования виджета?
● Для чего активно используются макросы вида
G_CALLBACK() и т.п.?
● Как осуществляется обработка событий?
● Как реализовано позиционирование?
● Какие библиотеки нужны для сборки?
● В чем состоит назначение pkg-config?
12Виджеты GTK+. Общая схема
● Создаем виджет с помощью одной из функций,
например, gtk_*_new()
● Связываем все сигналы и события, которые будут
использованы с обработчиками
● Устанавливаем атрибуты виджета
● Упаковываем виджет в контейнер с помощью
соответствующих ему функций, например,
gtk_container_add() или gtk_box_pack_start()
● Отображаем виджет, gtk_widget_show()
13Макросы приведения типов
● Общие функции, например, управления сигналами,
требуют приведения типов
● Приведение типов реализовано макросами
– обеспечивают возможность приведения
– осуществляют приведение
● Примеры
– G_OBJECT (object)
– GTK_WIDGET (widget)
– G_CALLBACK (function)
– GTK_CONTAINER (container)
14Сигналы и обработчики
Основной цикл GUI-приложения
– внешние (нажата клавиша, закрыто окно, и т.п.)
или внутренние события порождают сигналы
– приложение получает сигналы и инициирует их
обработку
– обработка сигнала осуществляется функцией
обратного вызова (предварительно
ассоциированной с ним)
– некоторые сигналы наследуют все виджеты
(destroy), некоторые специфичны (toggled)
15Обработка сигналов
Связывание сигнала с обработчиком
gulong g_signal_connect( gpointer *object,
const gchar *name,
GCallback func,
gpointer func_data );
или g_signal_connect_swapped (аргументы в обратном порядке)
Функция обратного вызова
void callback_func( GtkWidget *widget,
... /* прочие аргументы */
gpointer callback_data );
для g_signal_connect_swapped аргументы в обратном порядке
16Пример обработчика
Создаем функцию обратного вызова
static void destroy_cb( GtkWidget *widget,
gpointer data )
{
gtk_main_quit ();
}
Связываем с сигналом
g_signal_connect (G_OBJECT (window), "destroy",
G_CALLBACK (destroy_cb), NULL);
17Позиционирование
● Виджеты могут размещаться внутри других
● В примере использованы упаковки (packing boxes)
– невидимые контейнерные виджеты
– горизонтальная или вертикальная упаковка
– могут вкладываться в другие контейнеры
● Интерфейс
– gtk_hbox_new(), gtk_vbox_new()
– gtk_box_pack_start(), gtk_box_pack_end()
18Пример позиционирования
Вопросы для обсуждения
● В чем назначение параметров gomogenius и
spacing функций gtk_?box_new()?
● В чем назначение параметров expand, fill и padding
функций gtk_box_pack_*?
19Иерархия виджетов GTK+
Верхний уровень GtkWidget
● GObject ● GtkMisc
– GtkObject
● GtkContainer
● GtkCalendar
● GtkWidget
● GtkDrawingArea
● GtkAdjustment
● GtkEditable
● GtkCellRenderer
● GtkRuler
● GtkItemFactory
● GtkRange
● GtkTooltips
● GtkSeparator
● GtkTreeViewColumn
● GtkInvisible
● GtkPreview
● GtkProgressBar
20Кнопка — типичный виджет
Вопросы для обсуждения
● Каков интерфейс создания кнопки? кнопки с
меткой? кнопки с изображением?
● В каких случаях виджет Button порождает сигналы
pressed, released, clicked, enter, leave?
21Производные от GtkButton
● GtkContainer Вопросы для обсуждения
– GtkButton ● Как отображаются и
● GtkToggleButton каково назначение
– GtkCheckButton различных типов
● GtkRadioButton кнопок?
● GtkColorButton ● Какие сигналы они
● GtkFontButton порождают?
● GtkLinkButton
● GtkOptionMenu
● GtkScaleButton
– GtkVolumeButton
22Окно приложений GtkWindow
Вопросы для обсуждения
● Как создать окно, определить геометрию,
положение, состояние?
● С помощью каких свойств можно манипулировать
внешним видом окна?
● Какие типы окон (с точки зрения менеджера окон)
возможны?
● Какие сигналы связаны с GtkWindow?
● Как добавить полосы прокрутки к окну?
23Надписи с помощью GtkLabel
Вопросы для обсуждения
● В чем состоит назначение GtkLabel?
● Каковы возможности форматирования текста
надписи с помощью Pango?
● Как регулируется угол налона надписи?
● Как отобразить клавиатурный эквивалент в
надписи?
● Как осуществляется выравнивание с помощью
функций родительского класса GtkMisc?
24Ввод текста (GtkEntry)
Вопросы для обсуждения
● Какие свойства регулируют отображение и
возмжности ввода GtkEntry?
● Каков интерфейс управления содержимым поля
ввода?
● Какие сигналы могут быть порождены виджетом
GtkEntry?
25Инструменты ввода чисел
Вопросы для обсуждения
● Как установить границы диапазона? величину
шага?
● Как проверить введенное значение на
допустимость?
● Какие свойства изображения числа позволяет
регулировать GtkSpinButton?
26Изображения (GtkImage)
Вопросы для обсуждения
● Какие источники могут быть поставщиками
изображений для GtkImage?
● Какие форматы файлов поддерживаются?
● Что произойдет, если файл-источник не будет
обнаружен?
● Как можно определить тип источника или
распознать, что графических данных нет?
● Как можно получать сигналы с помощью
GtkEventBox?
27Контейнерные виджеты
● GtkContainer ● GtkContainer
– GtkBin – GtkFixed
● GtkAlignment – GtkFrame
● GtkExpander ● GtkAspectFrame
– GtkBox – GtkLayout
● GtkButtonBox – GtkNotebook
– GtkHButtonBox
– GtkVButtonBox – GtkPaned
● GtkHBox ● GtkHPaned
● GtkVBox ● GtkVPaned
– GtkTable
28Контейнеры GtkTable, GtkFixed
Вопросы для обсуждения
● Как осуществляется размещение виджетов в
ячейках таблицы?
● Что происходит при изменении размеров таблицы
после ее создания?
● В чем недостаток GtkFixed с точки зрения
приложения для мобильного устройства?
29Прочие контейнеры
Вопросы для обсуждения
● В чем особенности отображения содержимого
контейнеров Gtk[H|V]Paned, GtkExpander,
GtkNotebook?
● Каков интерфейс управления вкладками виджета
GtkNotebook?
● Каковы возможности группировки кнопок внутри
GtkButtonBox?
30Вы также можете почитать