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