У меня есть GtkGrid, и я хочу показать внутри одной ячейки виджет или другое в соответствии с выборами пользователя. Я написал свой код в соответствии с этим, в котором говорится:
Удаляет виджет из контейнера. виджет должен быть внутри контейнера. Обратите внимание : контейнер будет иметь ссылку на виджет и что это может быть последняя ссылка; поэтому удаление виджета из его контейнера может уничтожить этот виджет. Если вы хотите снова использовать виджет, вам нужно добавить ссылку на него, пока он не находится внутри контейнера, используя g_object_ref(). Если вы не хотите снова использовать виджет, он обычно более эффективен, чтобы просто уничтожить его напрямую с помощью gtk_widget_destroy(), поскольку это удалит его из контейнера и поможет разбить любые циклические циклы отсчета ссылок.
Вот фрагмент кода:
// Definitions
GtkWidget *myList1, *myList2;
// Creation
myList1 = gtk_tree_view_new();
myList2 = gtk_tree_view_new();
gtk_grid_attach(GTK_GRID(gridList), myList1, 0, 1, 2, 1); // Attach myList1
// Switching in runtime
if (x) {
g_object_ref(myList1);
gtk_container_remove(GTK_CONTAINER(gridList), myList1);
gtk_grid_attach(GTK_GRID(gridList), myList2, 0, 1, 2, 1);
} else {
g_object_ref(myList2);
gtk_container_remove(GTK_CONTAINER(gridList), myList2);
gtk_grid_attach(GTK_GRID(gridList), myList1, 0, 1, 2, 1);
}
Когда я выполняю переключение (я хочу удалить myList1
и вставить myList2
), тогда я получаю пустую ячейку в своей сетке. Во всяком случае, когда я повторяю переключение, объект myList1
снова появляется в сетке, как я хочу.
Во время этих операций я не получаю предупреждения GTK на терминале. x
устанавливается true
или false
правильно в соответствии с выбором двух переключателей.
Что происходит? Я пропустил некоторые проходы?
Для этого вам понадобится gtk_widget_show_all(myList2)
. Ваш gtk_widget_show_all()
который показывает, что GtkWindow GtkGrid является дочерним, показывает только детей во время вызова.
У вашего кода есть скрытая ошибка: подсчет ссылок всегда увеличивается на два, а уменьшается на единицу, потому что gtk_grid_attach()
(на самом деле gtk_widget_set_parent()
) делает свой собственный g_object_ref()
(фактически g_object_ref_sink()
).