Повторно использовать виджет, используя g_object_ref ()

0

У меня есть 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 правильно в соответствии с выбором двух переключателей.

Что происходит? Я пропустил некоторые проходы?

Теги:
widget
gtk

1 ответ

1
Лучший ответ

Для этого вам понадобится 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()).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню