Удалите дочерние элементы контейнера GTK +, снова заполните его, затем обновите - PullRequest
7 голосов
/ 08 февраля 2012

У меня проблема с приложением GTK + C. У меня есть контейнер, который при запуске приложения содержит кнопку. Во время работы пользовательский интерфейс должен заставить этот виджет содержать больше из них.
Мне нужно написать функцию, которая удаляет все «старые» внутренние кнопки, затем добавляет все из списка и, наконец, обновляет представление. Это то, что я пишу, но некоторые части отсутствуют (TODO)

void refresh_sequence_panel() 
{
    GSList* iterator = NULL;
    GtkWidget* button;

    // TODO: Here the container must be empty

    // Now add all the buttons
    for (iterator = steps; iterator; iterator = iterator->next) {
       button = gtk_button_new_from_stock(GTK_STOCK_ADD);
       gtk_widget_set_size_request(button, SEQ_BUTTON_W, SEQ_BUTTON_H);
       gtk_box_pack_start(GTK_BOX(sequence_panel), button, FALSE, FALSE, 5);
       handler_id = g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(seq_popup), GTK_BOX(sequence_panel));
    }

    // TODO: Now refresh the view, so I can see the changes...
}

Надеюсь, что кто-то может помочь, спасибо!

Ответы [ 3 ]

12 голосов
/ 08 февраля 2012

Удаление всех дочерних элементов:

GList *children, *iter;

children = gtk_container_get_children(GTK_CONTAINER(container));
for(iter = children; iter != NULL; iter = g_list_next(iter))
  gtk_widget_destroy(GTK_WIDGET(iter->data));
g_list_free(children);

Обратите внимание, что приведенное выше просто удаляет каждый дочерний виджет напрямую, вместо того, чтобы просить контейнер удалить его (с gtk_container_remove()), это рекомендуетсядокументация и соответствует вашим намерениям, так что, на мой взгляд, все в порядке.

Нет смысла «обновлять представление», если вы фактически добавляете и отображаете недавно созданные виджеты в контейнер.GTK + основан на событиях, и добавление дочерних элементов в контейнер позволяет контейнеру понять, что ему необходимо автоматически обновлять внешний вид.

0 голосов
/ 06 ноября 2013

Этот работал для меня (это вариант ответа откручивания):

Glib::ListHandle<Widget*> childList = this->get_children();
Glib::ListHandle<Widget*>::iterator it = childList.begin();

while (it != childList.end()) {
    remove(*(*it));
    it++;
}

(GTKMM 2.4)

0 голосов
/ 01 сентября 2012

Вот метод, которому я следовал.Потому что я использую gtkmm на c ++

Gtk::Box_Helpers::BoxList *childList = &vboxImgLst->children();
Box_Helpers::BoxList::iterator start = childList->begin();
Box_Helpers::BoxList::iterator end = childList->end();

childList->erase(start, end);

, где vboxImgLst ,

VBox *vboxImgLst;

Надеюсь, это поможет кому-то, кто использует gtkmm и c ++.

Спасибо

...