5. Глава 31: GTK Быстрая справка (Cheat Sheets)

5.1. Введение

GTK (GIMP Toolkit) — кроссплатформенный набор инструментов для создания графических интерфейсов на C. В версии 3 используется GObject и CSS для стилизации.

5.2. Подключение библиотеки

Для компиляции используйте:

gcc `pkg-config --cflags gtk+-3.0` -o app main.c `pkg-config --libs gtk+-3.0`

5.3. Основные типы и объекты

  • GtkWidget — базовый тип для всех виджетов

  • GtkWindow — окно приложения

  • GtkButton — кнопка

  • GtkBox — контейнер для компоновки виджетов (горизонтальный или вертикальный)

  • GtkLabel — текстовая метка

  • GtkEntry — поле ввода текста

  • GtkGrid — сеточный контейнер

5.4. Создание окна

GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "Заголовок");
gtk_window_set_default_size(GTK_WINDOW(window), 400, 300);
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
gtk_widget_show_all(window);

5.5. Сигналы и обработчики

GTK использует систему сигналов для событий.

Пример подключения сигнала кнопки:

void on_button_clicked(GtkButton *button, gpointer user_data) {
    g_print("Кнопка нажата\n");
}

GtkWidget *button = gtk_button_new_with_label("Нажми меня");
g_signal_connect(button, "clicked", G_CALLBACK(on_button_clicked), NULL);

5.6. Компоновка (Layout)

Пример использования GtkBox для вертикального размещения:

GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
gtk_box_pack_start(GTK_BOX(vbox), widget1, TRUE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(vbox), widget2, TRUE, TRUE, 0);

5.7. Стандартный цикл GTK

gtk_init(NULL, NULL);
gtk_main();

5.8. Работа с виджетами

  • gtk_widget_show(widget) — показать виджет

  • gtk_widget_hide(widget) — скрыть виджет

  • gtk_widget_set_sensitive(widget, gboolean) — сделать виджет активным/неактивным

5.9. Диалоги

Пример простого диалога:

GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(parent_window),
    GTK_DIALOG_DESTROY_WITH_PARENT,
    GTK_MESSAGE_INFO,
    GTK_BUTTONS_OK,
    "Сообщение пользователю");
gtk_dialog_run(GTK_DIALOG(dialog));
gtk_widget_destroy(dialog);

5.10. CSS-стилизация

Для кастомизации интерфейса можно использовать CSS-файлы и применять их через GtkCssProvider.

Пример подключения:

GtkCssProvider *provider = gtk_css_provider_new();
gtk_css_provider_load_from_path(provider, "style.css", NULL);
gtk_style_context_add_provider_for_screen(gdk_screen_get_default(),
    GTK_STYLE_PROVIDER(provider),
    GTK_STYLE_PROVIDER_PRIORITY_USER);
g_object_unref(provider);

5.11. Глава 31. Советы и рекомендации

  • Используйте GObject для расширения виджетов и построения собственных классов.

  • Обязательно освобождайте ресурсы — GTK активно использует указатели и объекты с подсчетом ссылок.

  • Для отладки удобно использовать g_print() и GTK_DEBUG переменные среды.

  • Следите за тем, чтобы GTK вызывался из основного потока (main thread).

  • Для сложных интерфейсов применяйте GtkBuilder и файлы .ui (XML).

  • Используйте сигналы и обратные вызовы для разделения логики и UI.

  • Помните про принцип «не блокировать основной цикл» — для длительных операций используйте GThread или GAsync.

5.12. Онлайн инструменты и документация