Spec-Zone.ru › GTK 3.24

Начало работы с GTK+

Основы
Укладка
Создание пользовательских интерфейсов
Создание приложений
Тривиальное приложение
Заполнение окна
Открытие файлов
Меню приложения
Диалог настроек
Добавление строки поиска
Добавление боковой панели
Свойства
Панель заголовка
Пользовательское рисование

GTK+ — это набор инструментов виджетов. Каждый пользовательский интерфейс, созданный с помощью GTK+, состоит из виджетов. Это реализуется на языке C с использованием GObject, объектно-ориентированной среды для C. Виджеты организованы в иерархии. Виджет окна является основным контейнером. Пользовательский интерфейс затем строится путём добавления кнопок, выпадающих меню, полей ввода и других виджетов в окно. Если вы создаёте сложные пользовательские интерфейсы, рекомендуется использовать GtkBuilder и его язык разметки, специфичный для GTK, вместо ручного сборки интерфейса. Вы также можете использовать редактор визуального пользовательского интерфейса, такой как Glade.

GTK+ — это основанная на событиях среда. Набор инструментов следит за событиями, такими как щелчок по кнопке, и передаёт событие вашему приложению.

В этой главе содержится информация по начальному руководству для работы с GTK+ программирования. Предполагается, что у вас установлен GTK+, его зависимости и компилятор C, готовые к использованию. Если вам необходимо сначала скомпилировать сам GTK+, обратитесь к разделу Компиляция библиотек GTK+ в этом справочнике.

Чтобы начать наше знакомство с GTK, мы начнём с простого приложения GTK на основе сигналов. Эта программа создаст пустое окно размером 200 × 200 пикселей.

Создайте новый файл с содержанием, указанным ниже, и назовите его example-0.c.

#include <gtk/gtk.h>

static void
activate (GtkApplication* app,
          gpointer        user_data)
{
  GtkWidget *window;

  window = gtk_application_window_new (app);
  gtk_window_set_title (GTK_WINDOW (window), "Window");
  gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);
  gtk_widget_show_all (window);
}

int
main (int    argc,
      char **argv)
{
  GtkApplication *app;
  int status;

  app = gtk_application_new ("org.gtk.example", G_APPLICATION_FLAGS_NONE);
  g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
  status = g_application_run (G_APPLICATION (app), argc, argv);
  g_object_unref (app);

  return status;
}

Вы можете скомпилировать программу выше с помощью GCC следующим образом:

gcc `pkg-config --cflags gtk+-3.0` -o example-0 example-0.c `pkg-config --libs gtk+-3.0`

Дополнительная информация о том, как скомпилировать приложение GTK+, приведена в разделе Компиляция приложений GTK+ в данном справочнике.

Все приложения GTK+ будут, конечно, включать gtk/gtk.h, который объявляет функции, типы и макросы, необходимые для приложений GTK+.

Даже если GTK+ устанавливает несколько заголовочных файлов, только верхнеуровневый заголовочный файл gtk/gtk.h может быть непосредственно включён сторонним кодом. Компилятор прервётся с ошибкой, если любой другой заголовочный файл будет включён напрямую.

В приложении GTK+ функция main() предназначена для создания объекта GtkApplication и его запуска. В этом примере вызывается указатель GtkApplication с именем app и затем инициализируется с помощью gtk_application_new().

При создании GtkApplication, необходимо выбрать идентификатор приложения (имя) и передать его в gtk_application_new() в качестве параметра. Для этого примера используется org.gtk.example, но для выбора идентификатора вашего приложения, см. это руководство. Наконец, gtk_application_new() принимает в качестве входных данных флаги GApplication для вашего приложения, если у вашего приложения есть особые потребности.

Далее, сигнал «activate» подключается к функции activate() выше функции main(). Сигнал activate будет отправлен при запуске вашего приложения с помощью g_application_run() в строке ниже. Функция gtk_application_run() также принимает в качестве аргументов указатели на счётчик аргументов командной строки и массив строк; это позволяет GTK+ анализировать специфические аргументы командной строки, которые управляют поведением самого GTK+. Проанализированные аргументы будут удалены из массива, оставив нераспознанные для анализа вашим приложением.

Внутри g_application_run отправляется сигнал activate(), и затем мы переходим к функции activate() приложения. Внутри функции activate() мы хотим создать наше окно GTK, чтобы окно отображалось при запуске приложения. Вызов gtk_application_window_new() создаст новое окно GtkWindow и сохранит его в указателе window. Окно будет иметь рамку, строку заголовка и элементы управления окном в зависимости от платформы.

Заголовок окна устанавливается с помощью gtk_window_set_title(). Эта функция принимает указатель GtkWindow* и строку в качестве входных данных. Поскольку наш указатель window — это указатель GtkWidget, нам нужно привести его к типу GtkWindow*. Но вместо приведения window через (GtkWindow*), window можно привести с помощью макроса GTK_WINDOW(). GTK_WINDOW() проверит, является ли указатель экземпляром класса GtkWindow, прежде чем привести его к типу, и выдаст предупреждение, если проверка завершится неудачно. Дополнительную информацию об этой конвенции можно найти здесь.

Наконец, размер окна устанавливается с помощью gtk_window_set_default_size, и окно отображается GTK с помощью gtk_widget_show_all().

При выходе из окна, например, при нажатии на X, g_application_run() в главном цикле возвращает число, которое сохраняется в целочисленной переменной с именем "status". После этого объект GtkApplication освобождается из памяти с помощью g_object_unref(). Наконец, возвращается целочисленное значение status, и приложение GTK завершается.

Во время выполнения программы GTK+ получает события. Обычно это события ввода, вызванные взаимодействием пользователя с вашей программой, а также сообщения от менеджера окон или других приложений. GTK+ обрабатывает их, и в результате на ваших виджетах могут генерироваться сигналы. Подключение обработчиков этих сигналов — это то, как вы обычно заставляете свою программу что-то делать в ответ на ввод пользователя.

Следующий пример немного сложнее и демонстрирует некоторые возможности GTK+.

В соответствии с давней традицией языков программирования и библиотек, он называется «Привет, мир».

Пример 1. «Привет, мир» в GTK+

Создайте новый файл с содержанием, указанным ниже, и назовите его example-1.c.

#include <gtk/gtk.h>

static void
print_hello (GtkWidget *widget,
             gpointer   data)
{
  g_print ("Hello World\n");
}

static void
activate (GtkApplication *app,
          gpointer        user_data)
{
  GtkWidget *window;
  GtkWidget *button;
  GtkWidget *button_box;

  window = gtk_application_window_new (app);
  gtk_window_set_title (GTK_WINDOW (window), "Window");
  gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);

  button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
  gtk_container_add (GTK_CONTAINER (window), button_box);

  button = gtk_button_new_with_label ("Hello World");
  g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);
  g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);
  gtk_container_add (GTK_CONTAINER (button_box), button);

  gtk_widget_show_all (window);
}

int
main (int    argc,
      char **argv)
{
  GtkApplication *app;
  int status;

  app = gtk_application_new ("org.gtk.example", G_APPLICATION_FLAGS_NONE);
  g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
  status = g_application_run (G_APPLICATION (app), argc, argv);
  g_object_unref (app);

  return status;
}

Вы можете скомпилировать программу выше с помощью GCC следующим образом:

gcc `pkg-config --cflags gtk+-3.0` -o example-1 example-1.c `pkg-config --libs gtk+-3.0`

Как видно выше, example-1.c дополняет example-0.c, добавив в наше окно кнопку с надписью «Привет, мир». Для этого объявляются два новых указателя GtkWidget, button и button_box. Переменная button_box создаётся для хранения GtkButtonBox, который в GTK+ отвечает за управление размером и расположением кнопок. GtkButtonBox создаётся и присваивается gtk_button_box_new(), который принимает в качестве параметра перечисление GtkOrientation. Кнопки, которые будет содержать эта коробка, могут храниться либо горизонтально, либо вертикально, но в этом конкретном случае это не имеет значения, так как мы работаем только с одной кнопкой. После инициализации button_box с горизонтальной ориентацией код добавляет виджет button_box к виджету окна с помощью gtk_container_add().

Далее, переменная button инициализируется аналогичным образом. Вызывается gtk_button_new_with_label(), который возвращает GtkButton, который сохраняется в button. После этого button добавляется к нашему button_box. С помощью g_signal_connect кнопка подключается к функции в нашем приложении с именем print_hello(), так что при нажатии на кнопку GTK вызовет эту функцию. Поскольку функция print_hello() не использует входные данные, ей передаётся NULL. print_hello() вызывает g_print() со строкой «Привет, мир», которая выведет «Привет, мир» в терминал, если приложение GTK было запущено из терминала.

После подключения print_hello(), другой сигнал подключается к состоянию «нажатие» кнопки с помощью g_signal_connect_swapped(). Эта функция похожа на g_signal_connect(), но отличается тем, как обрабатывается функция обратного вызова. g_signal_connect_swapped() позволяют указать, что функция обратного вызова должна принимать в качестве параметра, передавая его в качестве данных. В этом случае вызываемая функция обратного вызова — gtk_widget_destroy(), и указатель window передается ей. Это приводит к тому, что при нажатии кнопки всё окно GTK уничтожается. В отличие от этого, если бы для подключения сигнала «нажатие» с gtk_widget_destroy() использовалась обычная g_signal_connect(), то была бы уничтожена сама button, а не окно. Более подробную информацию о создании кнопок можно найти здесь.

Остальная часть кода в файле example-1.c идентична example-0.c. В следующем разделе будет более подробно описано, как добавить несколько GtkWidgets в ваше приложение GTK.

© 2005–2020 The GNOME Project
Licensed under the GNU Lesser General Public License version 2.1 or later.
https://developer.gnome.org/gtk3/3.24/gtk-getting-started.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API