В первую очередь нам необходимо запустить приложение Glade для создания интерфейса главного окна программы. Если приложение Glade у вас не установлено, то его нужно установить при помощи пакетного менеджера вашего Linux дистрибутива.
Запустите приложение Glade и при помощи его возможностей создайте окно (Смотрите рисунок 1).
Рисунок
1. Создание окна при помощи Glade
1) В палитре
виджетов в разделе Toplevel выберите виджет
с именем Window.
2) Присвойте
виджету главного окна имя mainwindow. Также
задайте заголовок окна и его размеры.
3) Сохраним
интерфейс главного окна в файл с именем
mainwindow.glade в ранее подготовленный каталог
с именем glade_p1, где-нибудь в вашем домашнем
каталоге.
Все свойства
окна мы правили на вкладке General. Теперь
перейдем на вкладку Signals и прикрутим
функцию gtk_main_quit к сигналу destroy. Это нужно
для того, чтобы наше главное окно
закрывалось по нажатию на кнопку закрытия
окна или просто крестик (Смотрите рисунок
2).
Рисунок
2. Установка сигнала destroy и соединение
его с функцией gtk_main_quit
Ну вот,
пользовательский интерфейс сделали,
сигналы подключили, файл сохранили,
теперь переходим к написанию кода, с
помощью которого будем загружать наше
glade — окно.
Запускаем
среду программирования Geany. Данную
программу мы использовали в прошлых
постах для создания минимального GTK
приложения и других примеров GTK программ.
Так что будем все дальнейшие действия
основывать на прошлых достижениях, в
частности, нас будет интересовать
настройка
среды Geany и код минимального GTK приложения,
который мы поправим под нашу задачу.
Создайте
и сохраните файл main.c в каталог с файлом
интерфейса mainwindow.glade. Пропишите параметры
компиляции и сборки проекта. Об этом я
писал в прошлых постах. Напишем код -
основу, с которого и начнем развивать
проект:
#include <gtk/gtk.h>
int main(int argc, char **argv) {
GtkWidget *window = NULL;
gtk_init(&argc, &argv);
gtk_widget_show(window);
gtk_main();
return 0;
}
Так, начнем дополнять наш код.
Ниже строчки, где мы определили указатель
на GtkWidget с именем window, мы добавим указатель
на структуру нашего интерфейса:
Далее определим указатель на
структуру для подробного отчета об
ошибке:
Далее после строчки, где мы
провели инициализацию GTK — функция
gtk_init, создаем новый объект типа GtkBuilder,
в нем будет хранится описание
пользовательского интерфейса:
builder = gtk_builder_new( );
Следующей строчкой мы пытаемся
загрузить, в структуру типа GtkBuilder, с
именем builder, описание пользовательского
интерфейса из файла mainwindow.glade и проверяем
загрузку на ошибки, которые могут
возникнуть.
if ( !gtk_builder_add_from_file( builder,
"mainwindow.glade", &error ) ) {
g_warning( "%s", error->message );
g_free( error );
return ( 1 );
}
Следующей строчкой мы выбираем
объект пользовательского интерфейса
с именем mainwindow и преобразовываем его в
виджет окна с именем window.
window = GTK_WIDGET( gtk_builder_get_object( builder,
"mainwindow" ) );
Далее мы переносим все сигналы
из описания пользовательского интерфейса,
которые мы создали в Glade, и потом
сопоставляем их с нашим приложением:
gtk_builder_connect_signals( builder, NULL );
Уменьшаем количество ссылок
на объект GtkBuilder с именем builder, если
количество ссылок будет 0, то объект
уничтожается.
Далее мы показываем виджет с
именем window и передаем управление GTK
библиотеки.
Результат работы программы
показан на рисунке 3.
Рисунок
3. Окончательный вариант программы
Код
полностью:
#include <gtk/gtk.h>
int main(int argc, char **argv) {
GtkWidget *window = NULL;
GtkBuilder *builder = NULL;
GError *error = NULL;
gtk_init( &argc, &argv );
builder = gtk_builder_new( );
if ( !gtk_builder_add_from_file( builder,
"mainwindow.glade", &error ) ) {
g_warning( "%s", error->message );
g_free( error );
return ( 1 );
}
window = GTK_WIDGET( gtk_builder_get_object(
builder, "mainwindow" ) );
gtk_builder_connect_signals( builder, NULL );
g_object_unref( G_OBJECT( builder ) );
gtk_widget_show( window );
gtk_main( );
return ( 0 );
}
syntax highlighted by
Code2HTML, v. 0.9.1