GTK: Виджет контейнера (GtkBox)

Виджет контейнера используется для упаковки дочерних виджетов в горизонтальной или вертикальной плоскости.

Конструктор

Для создания виджета контейнера может использоваться следующий конструктор:

GtkBox *box = gtk_box_new(orientation, spacing);

Параметр spacing позволяет указать необходимое количество пикселей свободного пространства между дочерними виджетами. Параметр orientation позволяет указать, в какой плоскости будут размещаться дочерние виджеты:

  • GTK_ORIENTATION_HORIZONTAL — дочерние виджеты будут размещаться в горизонтальной плоскости
  • GTK_ORIENTATION_VERTICAL — дочерние виджеты будут размещаться в вертикальной плоскости

Методы

Дочерние виджеты могут добавляться в контейнер сверху или слева (в зависимости от плоскости размещения дочерних виджетов) и снизу или справа с помощью следующих методов соответственно:

gtk_box_pack_start(GTK_BOX(box), child, expand, fill, padding);
gtk_box_pack_end(GTK_BOX(box), child, expand, fill, padding);

Параметр child позволяет передать ссылку на объект дочернего виджета, который должен быть добавлен в контейнер. При использовании значения TRUE параметра expand дочерний виджет займет все доступное пространство контейнера, причем это пространство будет делиться пропорционально в случае добавления новых виджетов с значением TRUE этого параметра. Параметр fill учитывается лишь тогда, когда в качестве значения параметра expand используется логическое значение TRUE и позволяет виджету занять все доступное пространство. Наконец, параметр padding позволяет задать количество пикселей между добавляемым и уже добавленными соседними дочерними виджетами в дополнение к значению, заданному при создании контейнера с помощью параметра spacing.

Дочерний виджет может быть удален из контейнера с помощью следующего метода:

gtk_box_remove(GTK_BOX(box), child);

Также при необходимости дочерний виджет может быть передвинут в контейнере с помощью следующего метода:

gtk_box_reorder_child(GTK_BOX(box), child, position);

Параметр child позволяет передать указатель на объект дочернего виджета, который нужно передвинуть или удалить. Параметр position позволяет указать числовое значение, соответствующее новой позиции дочернего виджета в контейнере, причем значение 0 указывает на начальную (верхнюю или левую) позицию в контейнере.

По умолчанию дочерние виджеты размещаются в контейнере в горизонтальной плоскости. Плоскость размещения дочерних виджетов может быть изменена с помощью следующего метода:

gtk_box_set_orientation(GTK_BOX(box), orientation);

Параметр orientation может иметь значения GTK_ORIENTATION_HORIZONTAL и GTK_ORIENTATION_VERTICAL.

Добавленные в контейнер дочерние виджеты могут быть принудительно приведены к одинаковому размеру с помощью следующего метода:

gtk_box_set_homogeneous(GTK_BOX(box), homogeneous);

Здесь для приведения дочерних виджетов к одинаковому размеру в качестве значения параметра homogeneous должно использоваться значение TRUE, в противном случае — значение FALSE.

Количество пикселей свободного пространства между дочерними виджетами может быть задано после создания контейнера с помощью следующего метода:

gtk_box_set_spacing(GTK_BOX(box), spacing);

Для задания количества пикселей служит параметр spacing.

Информация о параметрах упаковки каждого из дочерних виджетов может использоваться следующий метод:

gtk_box_query_child_packing(GTK_BOX(box), child, expand, fill, padding, pack_type);

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

gtk_box_set_child_packing(GTK_BOX(box), child, expand, fill, padding, pack_type);

Параметры expand, fill и padding по назначению аналогичны параметрам методов gtk_box_pack_start() и gtk_box_pack_end(). Параметр pack_type может принимать следующие значения:

  • GTK_PACK_TYPE_START — виджет упаковывался слева или сверху контейнера
  • GTK_PACK_TYPE_END — виджет упаковывался справа или снизу контейнера

Привязка дочерних виджетов к родительским может устанавливаться с помощью следующего метода:

gtk_box_set_baseline_position(GTK_BOX(box), position);

Параметр position может принимать следующие значения:

  • GTK_BASELINE_POSITION_TOP — привязка к левой или верхней стороне контейнера
  • GTK_BASELINE_POSITION_CENTER — привязка к центру контейнера
  • GTK_BASELINE_POSITION_BOTTOM — привязка к правой или нижней стороне контейнера

Для установки центрального дочернего виджета контейнера может использоваться следующий метод:

gtk_box_set_center_widget(GTK_BOX(box), widget);

Пример

Это код простого приложения, создающего контейнер:

  1. #include <gtk/gtk.h>
  2.  
  3. static void destroy(GtkWidget *widget, gpointer data)
  4. {
  5.     gtk_main_quit();
  6. }
  7.  
  8. int main(int argc, char *argv[])
  9. {
  10.     gtk_init(&argc, &argv);
  11.  
  12.     GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  13.     gtk_window_set_default_size(GTK_WINDOW(window), -1, 200);
  14.     g_signal_connect(window, "destroy", G_CALLBACK(destroy), NULL);
  15.  
  16.     GtkWidget *label;
  17.  
  18.     GtkWidget *hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
  19.     gtk_container_add(GTK_CONTAINER(window), hbox);
  20.     label = gtk_label_new("Первая метка в горизонтальном контейнере");
  21.     gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0);
  22.     label = gtk_label_new("Вторая метка в горизонтальном контейнере");
  23.     gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0);
  24.  
  25.     GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
  26.     gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0);
  27.     label = gtk_label_new("Третья метка в вертикальном контейнере");
  28.     gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 0);
  29.     label = gtk_label_new("Четвертая метка в вертикальном контейнере");
  30.     gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 0);
  31.  
  32.     gtk_widget_show_all(window);
  33.  
  34.     gtk_main();
  35.  
  36.     return 0;
  37. }

Box

Загрузить исходный код примера

Он может быть скомпилирован с помощью компилятора GCC путем исполнения следующей команды:

$ gcc box.c `pkg-config --libs --cflags gtk+-3.0` -o box

Также вы можете использовать компилятор CLang:

$ clang box.c `pkg-config --libs --cflags gtk+-3.0` -o box