На ХабраХабре наконец-то появился новый блог, посвящённый GTK. Присоединяйтесь! :-)
Привет, %username%!
В сети бытуют страшные слухи об этом фреймворке, однако серией статей о нём на ХабраХабре я попытаюсь разрушить сложившиеся стереотипы.
GTK+ — это фреймворк для создания кроссплатформенного графического интерфейса пользователя (GUI). Наряду с Qt он является одной из двух наиболее популярных на сегодняшний день библиотек для X Window System.
Изначально эта библиотека была частью графического редактора GIMP, но позже стала независимой и приобрела популярность. GTK+ — это свободное ПО, распространяемое на условиях GNU LGPL и позволяющее создавать как свободное, так и проприетарное программное обеспечение.
![](https://habrastorage.org/r/w1560/storage2/5fa/e5a/5b9/5fae5a5b92e6016cff11118972d1e63b.png)
GTK+ написан на языке Си, однако несмотря на это, является объектно-ориентированным. Также можно использовать обёртки для следующих языков: Ada, C, C++, C#, D, Erlang, Fortran, GOB, Genie, Haskell, FreeBASIC, Free Pascal, Java, JavaScript, Lua, OCaml, Perl, PHP, PureBasic, Python, R, Ruby, Smalltalk, Tcl, Vala.
Внутри GTK+ состоит из двух компонентов: GTK, который содержит набор виджетов (кнопка, метка и т.д.) и GDK, который занят выводом результата на экран.
Внешний вид приложений может меняться программистом и/или пользователем. По-умолчанию приложения выглядят нативно, т.е. так же, как и другие приложение в этой системе. Кроме того, начиная с версии 3.0, можно менять внешний вид элементов с помощью CSS.
Для начала за основу возьмём вот такую заготовку:
Пожалуйста, не используйте одинарные комментарии (//), если как и я решили писать на Си.
Давайте для начала создадим окно нашего приложения. В GTK существует несколько типов окошек, но нам понадобится обычный GtkWindow. Вставьте в нашу заготовку следующий код:
Прежде чем продолжить, несколько слов об упаковке.
В GTK+ виджеты принято размещать не по координатам, а упаковывать в специальные контейнеры. Окно, которое мы создали, также является контейнером, который может содержать только один виджет. Нам этого хватит, но в ином случае нам бы пришлось добавить специальный виджет-контейнер, который может представлять из себя сетку, а также горизонтальные или вертикальные поля. Но об этом я подробнее расскажу в следующем топике.
Пока остановимся на окне. Напомню, что окно — это контейнер, которому мы указали толщину границ в 50 пикселей. Что это значит?
![](https://habrastorage.org/r/w1560/storage2/7ad/dda/5b1/7addda5b134a471c9f38a4ad9e75f341.png)
Это значит, что мы создаём своего рода невидимую рамку вокруг этого контейнера и по этому ничего не сможем разместить в этой области.
Теперь рассмотрим сигналы.
Мы можем связать определённое событие, которое должно произойти с виджетом, со своей функцией.
В данном случае это стандартная фунция
Теперь создадим кнопку, по нажатию на которую будет появляться окошко с надписью «И тебе привет, %username%!».
Кнопка (GtkButton) — это тоже контейнер, который также может содержать один виджет. Чтобы не усложнять код созданием метки и помещением её в кнопку, сделаем вот так:
Выглядеть это будет так:
![](https://habrastorage.org/r/w1560/storage2/5fa/e5a/5b9/5fae5a5b92e6016cff11118972d1e63b.png)
Теперь реализация функции
Результат после нажатия:
![](https://habrastorage.org/r/w1560/storage2/7a9/b0e/2d6/7a9b0e2d6c3475493dbc43282a8b3b9c.png)
Вот так просто и быстро мы создали рабочую программу. В следующих топиках я расскажу про использование Glade (программа, чтобы рисовать виджеты без кода) и создание собственных виджетов.
Не забудьте установить пакет GTK для разработчика (кончается на "-dev").
Да, пожалуй, приведу несколько ссылок:
www.gtk.org — официальный сайт
www.gtkforums.com — англоязычный форум, посвящённый GTK
developer.gnome.org — информация для разработчиков под среду GNOME. Содержит много полезной информации о GTK, в том числе и на русском языке.
UPD: Полный код примера на PasteBin — pastebin.com/iPttWBne![](http://st.habrate.ru/pixel.gif)
Привет, %username%!
В сети бытуют страшные слухи об этом фреймворке, однако серией статей о нём на ХабраХабре я попытаюсь разрушить сложившиеся стереотипы.
GTK+ — это фреймворк для создания кроссплатформенного графического интерфейса пользователя (GUI). Наряду с Qt он является одной из двух наиболее популярных на сегодняшний день библиотек для X Window System.
Изначально эта библиотека была частью графического редактора GIMP, но позже стала независимой и приобрела популярность. GTK+ — это свободное ПО, распространяемое на условиях GNU LGPL и позволяющее создавать как свободное, так и проприетарное программное обеспечение.
![](https://habrastorage.org/storage2/5fa/e5a/5b9/5fae5a5b92e6016cff11118972d1e63b.png)
Как это работает
GTK+ написан на языке Си, однако несмотря на это, является объектно-ориентированным. Также можно использовать обёртки для следующих языков: Ada, C, C++, C#, D, Erlang, Fortran, GOB, Genie, Haskell, FreeBASIC, Free Pascal, Java, JavaScript, Lua, OCaml, Perl, PHP, PureBasic, Python, R, Ruby, Smalltalk, Tcl, Vala.
Внутри GTK+ состоит из двух компонентов: GTK, который содержит набор виджетов (кнопка, метка и т.д.) и GDK, который занят выводом результата на экран.
Внешний вид приложений может меняться программистом и/или пользователем. По-умолчанию приложения выглядят нативно, т.е. так же, как и другие приложение в этой системе. Кроме того, начиная с версии 3.0, можно менять внешний вид элементов с помощью CSS.
Делаем «Hello, World»
Для начала за основу возьмём вот такую заготовку:
#include <gtk/gtk.h> /* подключаем GTK+ */
/* эта функция будет выполнена первой */
int main( int argc, char *argv[])
{
/* тут мы объявим переменные */
/* запускаем GTK+ */
gtk_init(&argc, &argv);
/* тут будет код нашего приложения */
/* передаём управление GTK+ */
gtk_main();
return 0;
}
Пожалуйста, не используйте одинарные комментарии (//), если как и я решили писать на Си.
Давайте для начала создадим окно нашего приложения. В GTK существует несколько типов окошек, но нам понадобится обычный GtkWindow. Вставьте в нашу заготовку следующий код:
/* это вставьте вначале, хотя на самом деле порядок не так важен */
GtkWidget *window;
/* ... */
/* создать новый виджет - окно */
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
/* дать окну заголовок */
gtk_window_set_title(GTK_WINDOW(window), "Введение в GTK");
/* установить внутренние границы (читайте ниже) */
gtk_container_set_border_width (GTK_CONTAINER(window), 50);
Прежде чем продолжить, несколько слов об упаковке.
В GTK+ виджеты принято размещать не по координатам, а упаковывать в специальные контейнеры. Окно, которое мы создали, также является контейнером, который может содержать только один виджет. Нам этого хватит, но в ином случае нам бы пришлось добавить специальный виджет-контейнер, который может представлять из себя сетку, а также горизонтальные или вертикальные поля. Но об этом я подробнее расскажу в следующем топике.
Пока остановимся на окне. Напомню, что окно — это контейнер, которому мы указали толщину границ в 50 пикселей. Что это значит?
![](https://habrastorage.org/storage2/7ad/dda/5b1/7addda5b134a471c9f38a4ad9e75f341.png)
Это значит, что мы создаём своего рода невидимую рамку вокруг этого контейнера и по этому ничего не сможем разместить в этой области.
Теперь рассмотрим сигналы.
Мы можем связать определённое событие, которое должно произойти с виджетом, со своей функцией.
/* когда пользователь закроет окно, то выйти из приложения */
g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
В данном случае это стандартная фунция
gtk_main_quit()
, которая безопасно завершит наше приложение.Теперь создадим кнопку, по нажатию на которую будет появляться окошко с надписью «И тебе привет, %username%!».
Кнопка (GtkButton) — это тоже контейнер, который также может содержать один виджет. Чтобы не усложнять код созданием метки и помещением её в кнопку, сделаем вот так:
/* это вставьте вначале, хотя на самом деле порядок не так важен */
GtkWidget *button;
/* ... */
/* создать кнопку с меткой */
button = gtk_button_new_with_label("Привет, ХабраХабр!");
/* упаковать нашу кнопку в окно */
gtk_container_add(GTK_CONTAINER(window), button);
/* когда пользователь кликнет по ней, то вызвать ф-цию welcome */
g_signal_connect(GTK_BUTTON(button), "clicked", G_CALLBACK(welcome), NULL);
Выглядеть это будет так:
![](https://habrastorage.org/storage2/5fa/e5a/5b9/5fae5a5b92e6016cff11118972d1e63b.png)
Теперь реализация функции
welcome
:/* выводит приветствие */
void welcome (GtkButton *button, gpointer data)
{
/* виджеты */
GtkWidget *dialog;
GtkWidget *label;
GtkWidget *content_area;
/* создать диалог */
dialog = gtk_dialog_new_with_buttons("Ошибка LOL!!!111",
NULL,
GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_STOCK_OK,
GTK_RESPONSE_ACCEPT,
NULL);
/* получить контейнер, в который будем пихать метку */
content_area = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
/* сама метка */
label = gtk_label_new("\n\nИ тебе привет, %username!%");
gtk_container_add(GTK_CONTAINER(content_area), label);
gtk_widget_show(label);
/* запускаем диалог */
gtk_dialog_run(GTK_DIALOG(dialog));
/* а потом прячем */
gtk_widget_destroy(dialog);
}
Результат после нажатия:
![](https://habrastorage.org/storage2/7a9/b0e/2d6/7a9b0e2d6c3475493dbc43282a8b3b9c.png)
Вот так просто и быстро мы создали рабочую программу. В следующих топиках я расскажу про использование Glade (программа, чтобы рисовать виджеты без кода) и создание собственных виджетов.
Компиляция
gcc file_name.c -o file_name `pkg-config --cflags --libs gtk+-3.0`
Не забудьте установить пакет GTK для разработчика (кончается на "-dev").
Что-нибудь ещё?
Да, пожалуй, приведу несколько ссылок:
www.gtk.org — официальный сайт
www.gtkforums.com — англоязычный форум, посвящённый GTK
developer.gnome.org — информация для разработчиков под среду GNOME. Содержит много полезной информации о GTK, в том числе и на русском языке.
UPD: Полный код примера на PasteBin — pastebin.com/iPttWBne
![](http://st.habrate.ru/pixel.gif)