Pull to refresh

Учимся использовать Glade

Reading time 3 min
Views 42K
В прошлый раз я обещал, что напишу про программу Glade.

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, "Привет, Хабр!");
}

Всё!

Tags:
Hubs:
+19
Comments 5
Comments Comments 5

Articles