Введение в разработку графических интерфейсов. Основы 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
Вы также можете почитать