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

Скачайте и установите Glade. Если вы используете GNU/Linux, то эта программа обязательно должна быть в ваших репозиториях.
Откройте Glade и создайте новый файл интерфейса (Файл -> Создать). Вместе с тем будет создано первое окошко. Пока в нём ничего нет, но зато посмотрите сколько виджетов нам доступно в панели слева!

Давайте поместим вертикальный контейнер типа GtkBox на форму. Выберите значок
и кликните по серому пространству на форме. Должен появиться диалог, где вас спросят сколько ячеек вы хотите. Хорошего должно быть по-немногу, по этому вместо трёх введите 2.

Окошко при этом разделится на две равные части. Помните, что в окне может быть только один виджет? Теперь пользователю будет казаться, что вы уместили два виджета.
Разместите что-нибудь в обоих частях, чтобы продолжить знакомство с методом упаковки в GTK. Я поместил метку и кнопку:

Как-то странно смотрятся эти два виджета — им явно тесно. Давайте посмотрим, что можно сделать.
Для начала посмотрим на настройки самого контейнера. Выделите его и найдите панель свойств справа.

Тут мы можем указать расстояние между виджетами, ориентацию контейнера (вертикальную или горизонтальную) и многое другое.
Если что-то вам станет непонятным, то просто поднесите курсор к названию свойства и появится подсказка.
Обратите также внимание, что изменённые вами параметры выделяются жирным шрифтом.
Теперь выделите метку и перейдите во вкладку «Упаковка» — тут содержатся свойства, которые позволяют настроить упаковку виджета в нашем контейнере GtkBox.

Включите «Расширяемость» и наша форма приобретёт несколько иной вид: метка будет стараться занять всё доступное пространство, а кнопка будет иметь минимально возможный размер.
Также можно изменить рамку окна (см. пред. топик) — я установил границу в 10 пикселей.
Для того, чтобы посмотреть результат, нажмите на кнопку предпросмотра (
).

Теперь давайте сделаем так, чтобы по нажатии на кнопку надпись в метке менялась.
Выделите кнопку и в свойствах перейдите во вкладку «Сигналы».
Найдите событие «clicked» и введите имя обработчика «helloworld», а в качестве данных укажите ему нашу метку.

В общем, на этом всё. Дальше перейдём к программированию.
Написать кое-какой код нам всё же придётся.
Для начала давайте возьмём вот такой шаблон, который будет пытаться открыть файл с интерфейсом «habrahabr.ui».
Теперь давайте сделаем обработчик сигнала, который мы назвали «helloworld»:
Всё!


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

Начало работы с Glade
Скачайте и установите Glade. Если вы используете GNU/Linux, то эта программа обязательно должна быть в ваших репозиториях.
Откройте Glade и создайте новый файл интерфейса (Файл -> Создать). Вместе с тем будет создано первое окошко. Пока в нём ничего нет, но зато посмотрите сколько виджетов нам доступно в панели слева!

Давайте поместим вертикальный контейнер типа GtkBox на форму. Выберите значок
и кликните по серому пространству на форме. Должен появиться диалог, где вас спросят сколько ячеек вы хотите. Хорошего должно быть по-немногу, по этому вместо трёх введите 2.
Окошко при этом разделится на две равные части. Помните, что в окне может быть только один виджет? Теперь пользователю будет казаться, что вы уместили два виджета.
Разместите что-нибудь в обоих частях, чтобы продолжить знакомство с методом упаковки в GTK. Я поместил метку и кнопку:

Как-то странно смотрятся эти два виджета — им явно тесно. Давайте посмотрим, что можно сделать.
Для начала посмотрим на настройки самого контейнера. Выделите его и найдите панель свойств справа.

Тут мы можем указать расстояние между виджетами, ориентацию контейнера (вертикальную или горизонтальную) и многое другое.
Если что-то вам станет непонятным, то просто поднесите курсор к названию свойства и появится подсказка.
Обратите также внимание, что изменённые вами параметры выделяются жирным шрифтом.
Теперь выделите метку и перейдите во вкладку «Упаковка» — тут содержатся свойства, которые позволяют настроить упаковку виджета в нашем контейнере GtkBox.

Включите «Расширяемость» и наша форма приобретёт несколько иной вид: метка будет стараться занять всё доступное пространство, а кнопка будет иметь минимально возможный размер.
Также можно изменить рамку окна (см. пред. топик) — я установил границу в 10 пикселей.
Для того, чтобы посмотреть результат, нажмите на кнопку предпросмотра (
).
Сигналы
Теперь давайте сделаем так, чтобы по нажатии на кнопку надпись в метке менялась.
Выделите кнопку и в свойствах перейдите во вкладку «Сигналы».
Найдите событие «clicked» и введите имя обработчика «helloworld», а в качестве данных укажите ему нашу метку.

В общем, на этом всё. Дальше перейдём к программированию.
Программирование
Написать кое-какой код нам всё же придётся.
Для начала давайте возьмём вот такой шаблон, который будет пытаться открыть файл с интерфейсом «habrahabr.ui».
/* Можете тупо скопировать код, но я всё же постараюсь объяснить что к чему :-) Читайте комментарии, в общем. */ #include <gtk/gtk.h> /* создание окна в этот раз мы вынесли в отдельную функцию */ static GtkWidget* create_window (void) { /* это виджет окна */ GtkWidget *window; /* это тот волшебный объект, который сделает за нас окошко */ GtkBuilder *builder; /* сюда будем складывать ошибки */ GError* error = NULL; /* тут загружаем файл с интерфейсом */ builder = gtk_builder_new (); if (!gtk_builder_add_from_file (builder, "habrahabr.ui", &error)) { /* загрузить файл не удалось */ g_critical ("Не могу загрузить файл: %s", error->message); g_error_free (error); } /* помните, мы подключали сигналы вручную? теперь это происходит автоматически! */ gtk_builder_connect_signals (builder, NULL); /* получаем виджет окна, чтобы его показать */ window = GTK_WIDGET (gtk_builder_get_object (builder, "window")); if (!window) { /* что-то не так, наверное, ошиблись в имени */ g_critical ("Ошибка при получении виджета окна"); } g_object_unref (builder); return window; } /* это главная функция нашего приложения, которая будет выполнена первой */ int main (int argc, char *argv[]) { /* виджет окна */ GtkWidget *window; /* запускаем GTK+ */ gtk_init (&argc, &argv); /* вызываем нашу функцию для создания окна */ window = create_window (); gtk_widget_show (window); /* передаём управление GTK+ */ gtk_main (); return 0; }
Теперь давайте сделаем обработчик сигнала, который мы назвали «helloworld»:
/* это и есть наш обработчик сигнала */ static void helloworld (GtkButton *button, gpointer label) { /* установить метке текст */ gtk_label_set_text (label, "Привет, Хабр!"); }
Всё!

