Spec-Zone.ru › GTK 4.0

Привет, мир

Вслед за давней традицией языков программирования и библиотек, этот пример называется Привет, мир.

Рисунок 2. Привет, мир

Hello, world

Привет, мир на 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API