Сообщество GNOME

Вики русскоязычной команды

Инструменты пользователя

Инструменты сайта


rukovodstva:programmirovanie_gui_s_pomoschju_gtk:vvedenie_v_gtk

Введение в GTK+

Первым делом необходимо установить GTK+. Подробнее см. главу установка GTK+.

Для разработчиков на GTK+ существует оффициальный рекомендуемый стиль оформления кода, регламентирующий отступы, применение скобок, функций, пробельных символов и т. п.

Привет, мир!

Напишем простейшее приложение следующего вида:

C
#include <gtk/gtk.h>
 
/* Функция обратного вызова. 
   Аргумент data игнорируется в этом примере. */
static void hello( GtkWidget *widget,
                   gpointer   data )
{
    g_print ("Hello World\n");
}
 
static gboolean delete_event( GtkWidget *widget,
                              GdkEvent  *event,
                              gpointer   data )
{
    /* Если из обработчика сигнала "delete-event" вернуть FALSE,
     * GTK отправит сигнал "destroy". Возврат TRUE означает, что
     * вы не хотите уничтожать окно.
     * Это часто применяется в диалогах
     * "Вы уверены, что хотите завершить приложение?" */
    g_print ("delete event occurred\n");
 
    /* Если вы хотите закрыть главное окно, замените TRUE на FALSE */
    return TRUE;
}
 
/* Ещё одна функция обратного вызова */
static void destroy( GtkWidget *widget,
                     gpointer   data )
{
    gtk_main_quit ();
}
 
int main( int   argc,
          char *argv[] )
{
    /* Объекты GtkWidget служат контейнерами для виджетов */
    GtkWidget *window;
    GtkWidget *button;
 
    /* Вызов этой функции должен быть во ВСЕХ GTK-приложениях.
       Аргументы командной строки передаются и возвращаются в приложение. */
    gtk_init (&argc, &argv);
 
    /* Создать новое окно */
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
 
    /* When the window is given the "delete-event" signal (this is given
     * by the window manager, usually by the "close" option, or on the
     * titlebar), we ask it to call the delete_event () function
     * as defined above. The data passed to the callback
     * function is NULL and is ignored in the callback function. */
    g_signal_connect (window, "delete-event",
		      G_CALLBACK (delete_event), NULL);
 
    /* Here we connect the "destroy" event to a signal handler.  
     * This event occurs when we call gtk_widget_destroy() on the window,
     * or if we return FALSE in the "delete-event" callback. */
    g_signal_connect (window, "destroy",
		      G_CALLBACK (destroy), NULL);
 
    /* Sets the border width of the window. */
    gtk_container_set_border_width (GTK_CONTAINER (window), 10);
 
    /* Creates a new button with the label "Hello World". */
    button = gtk_button_new_with_label ("Hello World");
 
    /* When the button receives the "clicked" signal, it will call the
     * function hello() passing it NULL as its argument.  The hello()
     * function is defined above. */
    g_signal_connect (button, "clicked",
		      G_CALLBACK (hello), NULL);
 
    /* This will cause the window to be destroyed by calling
     * gtk_widget_destroy(window) when "clicked".  Again, the destroy
     * signal could come from here, or the window manager. */
    g_signal_connect_swapped (button, "clicked",
			      G_CALLBACK (gtk_widget_destroy),
                              window);
 
    /* This packs the button into the window (a gtk container). */
    gtk_container_add (GTK_CONTAINER (window), button);
 
    /* The final step is to display this newly created widget. */
    gtk_widget_show (button);
 
    /* and the window */
    gtk_widget_show (window);
 
    /* All GTK applications must have a gtk_main(). Control ends here
     * and waits for an event to occur (like a key press or
     * mouse event). */
    gtk_main ();
 
    return 0;
}

Сигналы и функции обратного вызова

GTK+ — это событийно-ориентированная библиотека. Основную часть времени GTK-приложение находится в основном цикле, который называется основным циклом обработки событий (main loop) — gtk_main(). При наступлении какого-либо события (нажатие на кнопку, вызов меню, перетаскивание виджета, прокрутка колеса мыши и т. п.) управление передаётся соответствующей функции-обработчику, которая называется функцией обратного вызова (callback). Передача управления функции обратного вызова осуществляется посредством сигналов (signals).

Несмотря на схожесть в названии, сигналы GTK+ не имеют ничего общего с системными сигналами UNIX.

Чтобы обработать нужно событие, например нажатие на кнопку, необходимо подключить сигнал, который поступит от этой кнопки, к функции обратного вызова:

C
gulong g_signal_connect( gpointer      *object,
                         const gchar   *name,
                         GCallback     func,
                         gpointer      func_data );

object — это указатель на объект, который отправляет сигнал. name — это название обрабатываемого сигнала. func — это функция обратного вызова. func_data — это данные, которые будут передаваться в функцию обратного вызова.

Функция обратного вызова, как правило, имеет следующий вид:

void callback_func( GtkWidget *widget,
                    ... /* прочие аргументы сигнала */
                    gpointer   callback_data );

widget — это указатель на виджет, который отправил сигнал. callback_data — это данные, которые передаются в качестве последнего аргумента в g_signal_connect.

Функция обратного вызова может иметь и другой вид, поскольку некоторые сигналы виджетов генерируют дополнительные параметры.

Ещё один вариант подключения сигнала, который представлен в примере:

gulong g_signal_connect_swapped( gpointer     *object,
                                 const gchar  *name,
                                 GCallback    func,
                                 gpointer     *callback_data );

Функция g_signal_connect_swapped() делает тоже самое, что и g_signal_connect(), но…

События

События — это более низкоуровневые сигналы. К событиям относится перемещение окна, перемещние курсора мыши, нажатие клавиш на клавиатуре и т. д. Также как и для сигналов ы можете назначать функции обратного вызова, которым будет передаваться управление при наступлении нужного события:

gint callback_func( GtkWidget *widget,
                    GdkEvent  *event,
                    gpointer   callback_data );

Подробный разбор программы «Привет, мир!»

Где получить помощь?

rukovodstva/programmirovanie_gui_s_pomoschju_gtk/vvedenie_v_gtk.txt · Последние изменения: 2015/03/16 23:47 — ymyasoedov

Инструменты страницы