Привет, мир
Вслед за давней традицией языков программирования и библиотек, этот пример называется Привет, мир.
Рисунок 2. Привет, мир
Привет, мир на C
Создайте новый файл с именем example-1.c, содержащий следующий код.
#include <gtk/gtk.h>
static void
print_hello (GtkWidget *widget,
gpointer data)
{
g_print ("Hello World\n");
}
static void
activate (GtkApplication *app,
gpointer user_data)
{
GtkWidget *window;
GtkWidget *button;
GtkWidget *box;
window = gtk_application_window_new (app);
gtk_window_set_title (GTK_WINDOW (window), "Window");
gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);
box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
gtk_window_set_child (GTK_WINDOW (window), box);
button = gtk_button_new_with_label ("Hello World");
g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);
g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_window_destroy), window);
gtk_box_append (GTK_BOX (box), button);
gtk_widget_show (window);
}
int
main (int argc,
char **argv)
{
GtkApplication *app;
int status;
app = gtk_application_new ("org.gtk.example", G_APPLICATION_FLAGS_NONE);
g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
status = g_application_run (G_APPLICATION (app), argc, argv);
g_object_unref (app);
return status;
}
Вы можете скомпилировать программу выше с помощью GCC, используя:
gcc `pkg-config --cflags gtk4` -o example-1 example-1.c `pkg-config --libs gtk4`
Как видно выше, пример-1.c дополняет пример-0.c, добавляя кнопку в наше окно с меткой “Привет, мир”. Для этого объявляются два новых указателя GtkWidget, button и box. Переменная box создается для хранения GtkBox, который является способом GTK управления размером и расположением кнопок.
GtkBox создается с помощью gtk_box_new(), который принимает перечисление GtkOrientation в качестве параметра. Кнопки, которые будет содержать эта коробка, могут быть расположены горизонтально или вертикально. В этом конкретном случае это не имеет значения, так как мы работаем только с одной кнопкой. После инициализации box с помощью только что созданного GtkBox, код добавляет виджет box к виджету окна с помощью gtk_window_set_child().
Далее переменная button инициализируется аналогичным образом. Вызывается gtk_button_new_with_label(), который возвращает GtkButton, который будет сохранен в button. После чего button добавляется в наш box.
Используя g_signal_connect(), кнопка подключается к функции в нашем приложении, называемой print_hello(), таким образом, когда кнопка нажимается, GTK вызовет эту функцию. Так как функция print_hello() не использует какие-либо данные в качестве входных данных, ей передается NULL. print_hello() вызывает g_print() со строкой “Привет, мир”, которая выведет «Привет, мир» в терминале, если приложение GTK было запущено из него.
После подключения print_hello(), другой сигнал подключается к состоянию “нажато” кнопки с помощью g_signal_connect_swapped(). Эта функция похожа на g_signal_connect() с разницей в том, как обрабатывается функция обратного вызова. g_signal_connect_swapped() позволяет указать, что функция обратного вызова должна принимать в качестве параметра, позволяя передать ее в качестве данных. В данном случае, вызываемая функция обратного вызова — gtk_window_destroy(), и ей передается указатель window. Это приводит к тому, что при нажатии кнопки всё окно GTK уничтожается. В отличие от этого, если для подключения сигнала “нажато” с помощью gtk_window_destroy() использовался бы обычный g_signal_connect(), то функция вызывалась бы с button (что было бы нежелательно, так как функция ожидает GtkWindow в качестве аргумента).
Дополнительную информацию о создании кнопок можно найти здесь.
Остальная часть кода в example-1.c идентична example-0.c. Следующий раздел более подробно расскажет о том, как добавить несколько GtkWidgets в ваше приложение GTK.
© 2005–2020 The GNOME Project
Licensed under the GNU Lesser General Public License version 2.1 or later.
https://developer-old.gnome.org/gtk4/4.0/ch01s02.html