Я пытаюсь найти дочерние виджеты по имени/типу из GtkStack. Эта функция работает на gtk3 --------
GtkWidget* find_child_by_name (GtkWidget* parent, const gchar* name)
{
printf("GtkWidget Name: %s\n\n", gtk_widget_get_name (parent));
if (g_strcmp0(gtk_widget_get_name(parent), name) == 0)
return parent;
GList* children = NULL;
if (GTK_IS_CONTAINER(parent))
children = gtk_container_get_children(GTK_CONTAINER(parent));
while (children != NULL)
{
GtkWidget* widget = find_child_by_name(children->data, name);
if (widget != NULL)
return widget;
children = children->next;
}
return NULL;
}
Но функция gtk_container_get_children
была удалена в Gtk4. Я видел эту функцию gtk_widget_observe_children
, но не понимаю, как она работает. Как это можно сделать в случае Gtk4?
gtk_stack_get_child_by_name()
? Мне не ясно, что вы имеете в виду под типом.
В GTK4 есть две функции, которые вы можете хорошо использовать:
GtkWidget*
gtk_widget_get_first_child (
GtkWidget* widget
)
и
GtkWidget*
gtk_widget_get_next_sibling (
GtkWidget* widget
)
С помощью цикла for вы можете просмотреть всех дочерних элементов.
Тогда значимое приложение могло бы выглядеть примерно так:
for (child = gtk_widget_get_first_child (widget);
child != NULL;
child = gtk_widget_get_next_sibling(child))
{
/* your code */
}
Для полноты картины следует отметить, что следующая функция также дает:
GtkWidget*
gtk_widget_get_prev_sibling (
GtkWidget* widget
)
Например, может использоваться в сочетании со следующей функцией:
GtkWidget*
gtk_widget_get_last_child (
GtkWidget* widget
)
Привет
Это полезно. Но мне нужна функция обратного звонка. Я не хочу его использовать, просто проверяю.
Не нравится то, что вы пытаетесь сделать: вызов этой функции позволит дополнительной внутренней бухгалтерии отслеживать детей и отправлять сигналы в возвращаемую модель списка. Это может сильно замедлить работу. Приложениям следует стараться избегать вызова этой функции из-за замедления работы.