GTK+ Reference Manual |
||||
---|---|---|---|---|
Top | Description | Object Hierarchy | Implemented Interfaces | Properties | Signals |
GtkContainerGtkContainer Базовый класс для виджетов содержащих другие виджеты |
#include <gtk/gtk.h>
GtkContainer;
#define GTK_IS_RESIZE_CONTAINER (widget)
#define GTK_CONTAINER_WARN_INVALID_CHILD_PROPERTY_ID(object, property_id, pspec)
#define gtk_container_border_width
void gtk_container_add (GtkContainer *container,
GtkWidget *widget);
void gtk_container_remove (GtkContainer *container,
GtkWidget *widget);
void gtk_container_add_with_properties
(GtkContainer *container,
GtkWidget *widget,
const gchar *first_prop_name,
...);
GtkResizeMode gtk_container_get_resize_mode (GtkContainer *container);
void gtk_container_set_resize_mode (GtkContainer *container,
GtkResizeMode resize_mode);
void gtk_container_check_resize (GtkContainer *container);
void gtk_container_foreach (GtkContainer *container,
GtkCallback callback,
gpointer callback_data);
void gtk_container_foreach_full (GtkContainer *container,
GtkCallback callback,
GtkCallbackMarshal marshal,
gpointer callback_data,
GtkDestroyNotify notify);
#define gtk_container_children
GList* gtk_container_get_children (GtkContainer *container);
void gtk_container_set_reallocate_redraws
(GtkContainer *container,
gboolean needs_redraws);
void gtk_container_set_focus_child (GtkContainer *container,
GtkWidget *child);
GtkAdjustment* gtk_container_get_focus_vadjustment
(GtkContainer *container);
void gtk_container_set_focus_vadjustment
(GtkContainer *container,
GtkAdjustment *adjustment);
GtkAdjustment* gtk_container_get_focus_hadjustment
(GtkContainer *container);
void gtk_container_set_focus_hadjustment
(GtkContainer *container,
GtkAdjustment *adjustment);
void gtk_container_resize_children (GtkContainer *container);
GType gtk_container_child_type (GtkContainer *container);
void gtk_container_child_get (GtkContainer *container,
GtkWidget *child,
const gchar *first_prop_name,
...);
void gtk_container_child_set (GtkContainer *container,
GtkWidget *child,
const gchar *first_prop_name,
...);
void gtk_container_child_get_property
(GtkContainer *container,
GtkWidget *child,
const gchar *property_name,
GValue *value);
void gtk_container_child_set_property
(GtkContainer *container,
GtkWidget *child,
const gchar *property_name,
const GValue *value);
void gtk_container_child_get_valist (GtkContainer *container,
GtkWidget *child,
const gchar *first_property_name,
va_list var_args);
void gtk_container_child_set_valist (GtkContainer *container,
GtkWidget *child,
const gchar *first_property_name,
va_list var_args);
void gtk_container_forall (GtkContainer *container,
GtkCallback callback,
gpointer callback_data);
guint gtk_container_get_border_width (GtkContainer *container);
void gtk_container_set_border_width (GtkContainer *container,
guint border_width);
void gtk_container_propagate_expose (GtkContainer *container,
GtkWidget *child,
GdkEventExpose *event);
gboolean gtk_container_get_focus_chain (GtkContainer *container,
GList **focusable_widgets);
void gtk_container_set_focus_chain (GtkContainer *container,
GList *focusable_widgets);
void gtk_container_unset_focus_chain (GtkContainer *container);
GParamSpec* gtk_container_class_find_child_property
(GObjectClass *cclass,
const gchar *property_name);
void gtk_container_class_install_child_property
(GtkContainerClass *cclass,
guint property_id,
GParamSpec *pspec);
GParamSpec** gtk_container_class_list_child_properties
(GObjectClass *cclass,
guint *n_properties);
GObject
+----GInitiallyUnowned
+----GtkObject
+----GtkWidget
+----GtkContainer
+----GtkBin
+----GtkBox
+----GtkCList
+----GtkFixed
+----GtkPaned
+----GtkIconView
+----GtkLayout
+----GtkList
+----GtkMenuShell
+----GtkNotebook
+----GtkSocket
+----GtkTable
+----GtkTextView
+----GtkToolbar
+----GtkTree
+----GtkTreeView
GtkContainer реализует AtkImplementorIface.
"border-width" guint : Read / Write
"child" GtkWidget : Write
"resize-mode" GtkResizeMode : Read / Write
"add" void user_function (GtkContainer *container,
GtkWidget *widget,
gpointer user_data) : Run first
"check-resize"
void user_function (GtkContainer *container,
gpointer user_data) : Run last
"remove" void user_function (GtkContainer *container,
GtkWidget *widget,
gpointer user_data) : Run first
"set-focus-child"
void user_function (GtkContainer *container,
GtkWidget *widget,
gpointer user_data) : Run first
Пользовательский интерфейс GTK+ конструируется методом вложения одних виджетов в другие. Контейнерные виджеты являются внутренними узлами в получающемся дереве виджетов: они содержат другие виджеты. Таким образом, например, вы можете иметь GtkWindow содержащий GtkFrame который в свою очередь содержит GtkLabel. Если вам нужно изображение внутри текстового ярлыка находящегося в рамке, вы можете переразместить виджет GtkLabel с виджетом GtkImage.
Есть два основных вида контейнерных виджетов в GTK+. Оба являются подклассами абстрактного базового класса GtkContainer.
Первый тип контейнерного виджета имеет единственный дочерний виджет и происходит от GtkBin. Эти контейнеры являются декораторами, которые добавляют некоторый вид функциональности к дочерним виджетам. Например, GtkButton создаёт свой дочерний виджет внутри нажимаемой кнопки; GtkFrame отображает рамку вокруг своего дочернего виджета, а GtkWindow размещает свой дочерний виджет внутри окна верхнего уровня.
Второй тип контейнеров может иметь больше одного дочернего виджета; его цель заключается в управлении размещением. Это означает что эти контейнеры определяют размер и позицию своих дочерних виджетов. Например, GtkHBox выравнивает свои дочерние виджеты в горизонтальную строку, а GtkTable распределяет своё содержимое в двух мерной сетке.
Для выполнения своей задачи, контейнер размещения должен согласовать запрашиваемый размер со своим родителем и дочерними виджетами. Это согласование выполняется в две фазы, запрос размера (size requisition) и распределение размера (size allocation).
Запрос размера виджета это желаемая высота и ширина. Это представляется объектом GtkRequisition.
Желаемый размер виджета как правило зависит от его дочерних виджетов. GtkLabel, например, запрашивает пространство достаточное для отображения всего текста который он представляет.
Фаза запроса размера виджета размещения
выполняется по нисходящей. Она начинается
в виджете верхнего уровня, обычно это
GtkWindow. Виджет верхнего
уровня запрашивает свои дочерние виджеты
о желаемом размере с помощью
gtk_widget_size_request()
.
Для определения своего размера, дочерние
виджеты запрашивают свои дочерние
виджеты о желаемом размере и т.д.. В конце
концов, виджет верхнего уровня получает
назад запрос от своего дочернего виджета.
Когда виджет верхнего уровня определил
сколько пространства нужно для дочерних
виджетов, начинается вторая фаза
согласования распределение размера.
В зависимости от конфигурации (смотрите
gtk_window_set_resizable()
),
виджет верхнего уровня может расшириться
для удовлетворения запрашиваемого
размера, или может проигнорировать
запрашиваемый, сохраняя фиксированный
размер. Тогда он говорит своему дочернему
виджету какое пространство он получит
с помощью gtk_widget_size_allocate()
.
Дочерний виджет распределяет полученное
пространство между своими дочерними
виджетами и т.д.. При нормальных
обстоятельствах, GtkWindow
всегда выдаёт дочерним виджетам
запрашиваемое ими пространство.
Распределение дочерних размеров представляется объектом GtkAllocation. Эта структура содержит не только ширину и высоту, но также позицию (то есть X и Y координаты), поэтому контейнер может сообщить своим дочерним виджетам не только какое пространство они должны занимать, но и где расположиться внутри контейнера.
Виджеты должны соблюдать распределённое для них пространство; запрос размера это только пожелание, виджеты должны уметь использовать любой размер.
GtkContainer представляет дочерние свойства это свойства объекта которые определены не для контейнера и его дочерних виджетов, а скорее для их связки. Типичный пример дочерних свойств позиция или тип упаковки виджета который находится в GtkBox.
Используйте
gtk_container_class_install_child_property()
для установки дочерних свойств
контейнерного класса, а
gtk_container_class_find_child_property()
или gtk_container_class_list_child_properties()
для получения информации о существующих
дочерних свойствах.
Для установки значения дочернего
свойства, используйте
gtk_container_child_set_property()
,
gtk_container_child_set()
или gtk_container_child_set_valist()
.
Для определения значения дочернего
свойства используйте
gtk_container_child_get_property()
,
gtk_container_child_get()
или gtk_container_child_get_valist()
.
Для издания уведомления об изменении
дочернего свойства используйте
gtk_widget_child_notify()
.
typedef struct _GtkContainer GtkContainer;
GTK_IS_RESIZE_CONTAINER()
#define GTK_IS_RESIZE_CONTAINER(widget) (GTK_IS_CONTAINER (widget) && ((GtkContainer*) (widget))->resize_mode != GTK_RESIZE_PARENT)
|
#define GTK_CONTAINER_WARN_INVALID_CHILD_PROPERTY_ID(object, property_id, pspec)
|
|
|
|
|
#define gtk_container_border_width gtk_container_set_border_widthВнимание
gtk_container_border_width
устарела и не должна использоваться во вновь создаваемом коде. Вместо неё используйтеgtk_container_set_border_width()
.Тоже самое что
gtk_container_set_border_width()
.
gtk_container_add ()
void gtk_container_add (GtkContainer *container, GtkWidget *widget);
Добавляет
widget
вcontainer
. Обычно используется для простых контейнеров, таких как GtkWindow, GtkFrame, или GtkButton; для более сложных контейнеров таких как GtkBox или GtkTable, эта функция выберет параметры по умолчанию, которые могут быть некорректны. Поэтому рассмотрите для этих случаев функцииgtk_box_pack_start()
иgtk_table_attach()
как альтернативуgtk_container_add()
. Одновременно виджет может быть добавлен только к одному контейнеру; вы можете разместить некоторые виджеты внутри двух разных контейнеров.
|
|
|
Виджет помещаемый в |
void gtk_container_remove (GtkContainer *container,
GtkWidget *widget);
Удаляет виджет widget
из
container
. widget
должен
находиться внутри container
.
Помните что container
владеет
ссылкой на widget
, и то что это
может быть последняя ссылка; поэтому
удаление виджета из контейнера может
уничтожить этот виджет. Если вам нужно
использовать widget
снова, вы
должны добавить на него ссылку пока он
не в контейнере, используя g_object_ref()
.
Если вы больше не хотите использовать
widget
наиболее эффективным
будет простое уничтожение с непосредственным
использованием gtk_widget_destroy()
,
так как это удалит его из контейнера и
поможет прекратить любые циклические
ссылки.
|
|
|
Текущий дочерний виджет для |
void gtk_container_add_with_properties
(GtkContainer *container,
GtkWidget *widget,
const gchar *first_prop_name,
...);
Добавляет widget
в container
,
одновременно устанавливая дочерние
свойства. Смотрите gtk_container_add()
и gtk_container_child_set()
для подробного изучения.
|
|
|
Виджет помещаемый в |
|
Имя первого дочернего свойства для установки |
|
|
GtkResizeMode gtk_container_get_resize_mode (GtkContainer *container);Определяет режим изменения размера контейнера. Смотрите
gtk_container_set_resize_mode()
.
|
|
Возвращает : |
Текущий режим изменения размера |
void gtk_container_set_resize_mode (GtkContainer *container,
GtkResizeMode resize_mode);
Устанавливает режим изменения размера.
Режим изменения размера контейнера определяет, будет ли помещённый в родитель контейнера запрос на изменение размера поставлен в очередь, для более позднего выполнения, или выполнен немедленно.
|
|
|
Новый режим изменения размера. |
void gtk_container_check_resize (GtkContainer *container);
|
void gtk_container_foreach (GtkContainer *container,
GtkCallback callback,
gpointer callback_data);
Вызывает callback
на каждом не
внутреннем дочернем виджете контейнера
container
. Смотрите
gtk_container_forall()
для деталей относительно того, что
составляет "внутренние" дочерние
виджеты. Большинство приложений должны
использовать gtk_container_foreach()
,
а не gtk_container_forall()
.
|
|
|
callback-функция |
|
Данные используемые callback-функцией |
void gtk_container_foreach_full (GtkContainer *container,
GtkCallback callback,
GtkCallbackMarshal marshal,
gpointer callback_data,
GtkDestroyNotify notify);
gtk_container_foreach_full
устарела и не должна использоваться во
вновь создаваемом коде. Вместо неё
используйте gtk_container_foreach()
.
|
|
|
|
|
|
|
|
|
#define gtk_container_children gtk_container_get_childrenВнимание
gtk_container_children
устарела и не должна использоваться во вновь создаваемом коде. Вместо неё используйтеgtk_container_get_children()
.Тоже самое что
gtk_container_get_children()
.
gtk_container_get_children ()
GList* gtk_container_get_children (GtkContainer *container);Определяет не внутренние дочерние виджеты контейнера. Смотрите
gtk_container_forall()
для деталей относительно того, что составляет "внутренние" дочерние виджеты.
|
|
Возвращает : |
Вновь созданный список не внутренних дочерних виджетов контейнера. |
void gtk_container_set_reallocate_redraws
(GtkContainer *container,
gboolean needs_redraws);
Устанавливает reallocate_redraws
флажок контейнера в полученное значение.
Контейнеры запрашивают перерисовку распределения автоматически, если любой дочерний виджет изменил положение.
|
|
|
Новое значение флажка |
void gtk_container_set_focus_child (GtkContainer *container,
GtkWidget *child);
|
|
|
GtkAdjustment* gtk_container_get_focus_vadjustment
(GtkContainer *container);
Определяет вертикальную регулировку
фокуса для контейнера. Смотрите
gtk_container_set_focus_vadjustment()
.
|
|
Возвращает : |
Вертикальная регулировка, или |
void gtk_container_set_focus_vadjustment
(GtkContainer *container,
GtkAdjustment *adjustment);
Устанавливает регулятор для обработки
фокуса в контейнере, таким образом когда
дочерний виджет контейнера находится
в фокусе, регулятор прокручивается для
отображения этого виджета. Эта функция
устанавливает вертикальное выравнивание.
Смотрите gtk_scrolled_window_get_vadjustment()
для обычного способа определения
регулировки и gtk_container_set_focus_hadjustment()
для установки горизонтальной регулировки.
Регулировки должны быть в пикселах и в той же самой координатной системе в которой распределены непосредственно дочерние виджеты контейнера.
|
|
|
Регулировки которые должны быть
откорректированы при перемещении
фокуса между дочерними виджетами
|
GtkAdjustment* gtk_container_get_focus_hadjustment
(GtkContainer *container);
Определяет горизонтальную регулировку
для контейнера. Смотрите
gtk_container_set_focus_hadjustment()
.
|
|
Возвращает : |
Горизонтальная регулировка фокуса,
или |
void gtk_container_set_focus_hadjustment
(GtkContainer *container,
GtkAdjustment *adjustment);
Устанавливает регулятор для обработки
фокуса в контейнере, таким образом когда
дочерний виджет контейнера находится
в фокусе, регулятор прокручивается для
отображения этого виджета. Эта функция
устанавливает вертикальное выравнивание.
Смотрите gtk_scrolled_window_get_hadjustment()
для обычного способа определения
регулировки и gtk_container_set_focus_vadjustment()
для установки горизонтальной регулировки.
Регулировки должны быть в пикселах и в той же самой координатной системе в которой распределены непосредственно дочерние виджеты контейнера.
|
|
|
Регулировки которые должны быть
откорректированы при перемещении
фокуса между дочерними виджетами
|
void gtk_container_resize_children (GtkContainer *container);
|
GType gtk_container_child_type (GtkContainer *container);Возвращает тип дочерних виджетов поддерживаемых контейнером.
Помните, она может вернуть
G_TYPE_NONE
указывающий что нельзя больше добавить дочерние виджеты, например для GtkPaned который уже имеет два дочерних виджета.
|
|
Возвращает : |
void gtk_container_child_get (GtkContainer *container,
GtkWidget *child,
const gchar *first_prop_name,
...);
Определяет значение одного или более
дочерних свойств для child
и
container
.
|
|
|
Дочерний виджет для |
|
Имя первого свойства для определения |
|
|
void gtk_container_child_set (GtkContainer *container,
GtkWidget *child,
const gchar *first_prop_name,
...);
Устанавливает одно или больше дочерних
свойств для child
и container
.
|
|
|
Дочерний виджет для |
|
Имя первого свойства для установки |
|
|
void gtk_container_child_get_property
(GtkContainer *container,
GtkWidget *child,
const gchar *property_name,
GValue *value);
Определяет значение дочернего свойства
для child
и container
.
|
|
|
Дочерний виджет для |
|
Имя определяемого свойства |
|
Определяемое значение |
void gtk_container_child_set_property
(GtkContainer *container,
GtkWidget *child,
const gchar *property_name,
const GValue *value);
Устанавливает дочернее свойство для
child
и container
.
|
|
|
Дочерний виджет для |
|
Имя устанавливаемого свойства |
|
Значение устанавливаемого свойства |
void gtk_container_child_get_valist (GtkContainer *container,
GtkWidget *child,
const gchar *first_property_name,
va_list var_args);
Определяет значения одного или более
дочерних свойств для child
и
container
.
|
|
|
Дочерний виджет для |
|
Имя первого определяемого свойства |
|
|
void gtk_container_child_set_valist (GtkContainer *container,
GtkWidget *child,
const gchar *first_property_name,
va_list var_args);
Устанавливает одно или более дочерние
свойства для child
и container
.
|
|
|
Дочерний виджет для |
|
Имя первого устанавливаемого свойства |
|
|
void gtk_container_forall (GtkContainer *container,
GtkCallback callback,
gpointer callback_data);
Вызывает callback
на каждом
дочернем виджете контейнера container
,
включая дочерние виджеты которые
считаются внутренними "internal"
(реализуют детали контейнера). "Внутренние"
дочерние виджеты обычно не добавляются
пользователем контейнера, а добавляются
непосредственно при реализации
контейнера. Большинство приложений
должны использовать gtk_container_foreach()
,
а не gtk_container_forall()
.
|
|
|
callback-функция |
|
Данные используемые callback-функцией |
guint gtk_container_get_border_width (GtkContainer *container);Определяет ширину окантовки контейнера. Смотрите
gtk_container_set_border_width()
.
|
|
Возвращает : |
Текущая ширина окантовки |
void gtk_container_set_border_width (GtkContainer *container,
guint border_width);
Устанавливает ширину окантовки контейнера.
Ширина окантовки это количество
пространства находящегося снаружи
контейнера. Единственное исключение
это GtkWindow; потому что
окно верхнего уровня не может иметь
внешнего пространства, оно предоставляет
внутреннее пространство. Окантовка
добавляется со всех сторон контейнера.
Для добавления только с одной стороны,
один из способов состоит в том чтобы
создать виджет GtkAlignment,
вызвав gtk_widget_set_usize()
для получения его размера, и поместить
его со стороны контейнера как интервал.
|
|
|
Количество свободного пространства с внешних сторон контейнера. Допустимыми значениями является диапазон от 0 до 65535 пикселей. |
void gtk_container_propagate_expose (GtkContainer *container,
GtkWidget *child,
GdkEventExpose *event);
Когда контейнер получает событие
экспозиции, он должен послать искусственное
событие экспозиции для всех дочерних
виджетов не имеющих собственного
GdkWindows. Эта функция обеспечивает удобный
способ выполнения этой задачи. Контейнер
получивший экспонирующее событие,
вызывает gtk_container_propagate_expose()
один раз для каждого дочернего виджета,
передовая событие полученное контейнером.
gtk_container_propagate_expose()
заботится о решении нужно ли экспонирующее
событие отправить дочернему виджету,
разделяя область события с дочерней
областью и передавая событие.
В большинстве случаев, контейнер может просто унаследовать реализацию ::expose из GtkContainer, или, выполнить некоторое отображение, а затем реализовать цепочку ::expose из GtkContainer.
|
|
|
Дочерний виджет контейнера |
|
Экспонирующее событие отправляемое контейнеру |
gboolean gtk_container_get_focus_chain (GtkContainer *container,
GList **focusable_widgets);
Определяет сфокусированную цепочку
контейнера, если была установлена явно.
Если нет явно установленной, сфокусированной
цепочки, GTK+ рассчитает сфокусированную
цепочку основываясь на позиции дочерних
виджетов. В этом случае, GTK+ сохраняет
NULL
в параметре focusable_widgets
и
возвращает FALSE
.
|
|
|
Сфокусированная цепочка контейнера,
или |
Возвращает : |
|
void gtk_container_set_focus_chain (GtkContainer *container,
GList *focusable_widgets);
Устанавливает сфокусированную цепочку, переписывая рассчитанную автоматически GTK+.
В принципе каждый виджет в цепочке должен быть потомком контейнера, но не вынуждается этим методом, так как позволяет установить сфокусированную цепочку перед упаковкой виджетов, или имеет виджеты в цепочке которая не всегда упакована. Необходимая проверка выполняется при фактическом пересечении сфокусированной цепочки.
|
|
|
Новая сфокусированная цепочка. |
void gtk_container_unset_focus_chain (GtkContainer *container);Удаляет сфокусированную цепочку явно установленную с помощью
gtk_container_set_focus_chain()
.
|
GParamSpec* gtk_container_class_find_child_property
(GObjectClass *cclass,
const gchar *property_name);
Находит дочернее свойство контейнерного класса по имени.
|
GtkContainerClass |
|
Имя дочернего свойства для поиска |
Возвращает : |
GParamSpec
дочернего свойства или |
void gtk_container_class_install_child_property
(GtkContainerClass *cclass,
guint property_id,
GParamSpec *pspec);
Устанавливает дочернее свойство в контейнерный класс.
|
GtkContainerClass |
|
id для свойства |
|
GParamSpec для свойства |
GParamSpec** gtk_container_class_list_child_properties
(GObjectClass *cclass,
guint *n_properties);
Определяет все дочерние свойства контейнерного класса.
|
GtkContainerClass |
|
Количество найденных дочерних свойств |
Возвращает : |
Массив GParamSpec*.
Массив должен освобождаться с помощью
|
border-width
""border-width" guint : Read / WriteШирина промежутка с внешней стороны контейнера.
Допустимые значения: <= G_MAXINT
Значение по умолчанию: 0
Свойство "
child
""child" GtkWidget : WriteМожет использоваться для добавления нового дочернего виджета в контейнер.
Свойство "
resize-mode
""resize-mode" GtkResizeMode : Read / WriteОпределяет как обрабатывать событие изменения размера.
Значение по умолчанию: GTK_RESIZE_PARENT
Детали сигналов
Сигнал "add"
void user_function (GtkContainer *container, GtkWidget *widget, gpointer user_data) : Run first
|
объект получающий сигнал. |
|
|
|
данные устанавливаемые при подключении обработчика сигнала. |
void user_function (GtkContainer *container,
gpointer user_data) : Run last
|
объект получающий сигнал. |
|
данные устанавливаемые при подключении обработчика сигнала. |
void user_function (GtkContainer *container,
GtkWidget *widget,
gpointer user_data) : Run first
|
объект получающий сигнал. |
|
|
|
данные устанавливаемые при подключении обработчика сигнала. |
void user_function (GtkContainer *container,
GtkWidget *widget,
gpointer user_data) : Run first
|
объект получающий сигнал. |
|
|
|
данные устанавливаемые при подключении обработчика сигнала. |