2012-02-08 12 views
5

Sono in un problema con un'applicazione GTK + C. Ho un contenitore che, all'avvio dell'applicazione, contiene un pulsante. Durante l'esecuzione un'interazione utente deve far sì che questo widget ne contenga di più.
Ho bisogno di scrivere una funzione che rimuove tutti i "vecchi" pulsanti interni, quindi aggiunge tutti quelli da un elenco e infine aggiorna la vista. Questo è quello che sto scrivendo, ma alcune parti sono mancanti (TODOs)Rimuovere i figli del contenitore GTK +, ripopolarlo, quindi aggiornare

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... 
} 

La speranza che qualcuno possa aiutare, grazie!

risposta

10

Rimozione tutti i bambini:

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); 

Si noti che quanto sopra appena cancella ciascun widget bambino direttamente, piuttosto che chiedere il contenitore per rimuoverlo (con gtk_container_remove()), questo è recommended by the documentation e partite che cosa si intende, quindi è bene secondo me.

Non c'è alcun punto in "aggiornare la vista", a patto che in realtà si aggiungano e mostrino i widget di nuova costruzione al contenitore. GTK + è basato su eventi e l'aggiunta di bambini a un contenitore fa capire al contenitore che è necessario aggiornare automaticamente l'aspetto visivo.

+0

Grazie, ero sicuro che hanno bisogno di un aggiornamento. – TheUnexpected

+0

Puoi anche fare: gtk_container_foreach (GTK_CONTAINER (contenitore), (GtkCallback) gtk_widget_destroy, NULL) –

0

Ecco il metodo che ho seguito. Perché io sto usando gtkmm su 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); 

dove vboxImgLst è,

VBox *vboxImgLst; 

Spero che questo vi aiuterà a qualcuno che utilizzano gtkmm e C++.

Grazie

0

Questo ha lavorato per me (si tratta di una variazione della risposta di svolgimento):

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

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

(gtkmm 2.4)

Problemi correlati