понедельник, 3 июля 2017 г.

Используем Glade для создания минимального GTK+ приложения

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

GtkBuilder *builder = NULL;

Далее определим указатель на структуру для подробного отчета об ошибке:

GError *error = NULL;

Далее после строчки, где мы провели инициализацию 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, то объект уничтожается.

g_object_unref( G_OBJECT( builder ) );

Далее мы показываем виджет с именем 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

Комментариев нет:

Отправить комментарий