2012-02-08 7 views
5

मुझे जीटीके + सी एप्लिकेशन के साथ समस्या है। मेरे पास एक कंटेनर है कि, एप्लिकेशन शुरू करते समय, एक बटन होता है। चलने वाले उपयोगकर्ता इंटरैक्शन के दौरान इस विजेट को उनमें से अधिक शामिल होना चाहिए।
मुझे एक ऐसा फ़ंक्शन लिखने की आवश्यकता है जो सभी "पुराने" आंतरिक बटन को हटा दे, फिर सभी को एक सूची से जोड़ दें और अंत में दृश्य को रीफ्रेश करें। यही वह है जो मैं लिख रहा हूं लेकिन कुछ हिस्सों में गायब हैं (TODOs)जीटीके + कंटेनर बच्चों को हटाएं, इसे दोबारा दोहराएं, फिर रीफ्रेश करें

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

आशा है कि कोई भी मदद कर सकता है, धन्यवाद!

उत्तर

10

निकाला जा रहा है सभी बच्चों:

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() के साथ) की तुलना में, इस recommended by the documentation है और मेल खाता है कि तुम क्या करना चाहते हैं, तो यह है मेरी राय में ठीक है।

जब तक आप वास्तव में नए निर्मित विजेट को कंटेनर में जोड़ते और दिखाते हैं, तब तक "दृश्य को ताज़ा करने" में कोई बात नहीं है। जीटीके + घटना आधारित है, और एक कंटेनर में बच्चों को जोड़ने से कंटेनर को एहसास हो जाता है कि इसे स्वचालित रूप से अपनी दृश्य उपस्थिति को रीफ्रेश करने की आवश्यकता होती है।

+0

धन्यवाद, मैं इसे एक ताज़ा की जरूरत है यकीन था। – TheUnexpected

+0

आप यह भी कर सकते हैं: gtk_container_foreach (GTK_CONTAINER (कंटेनर), (GtkCallback) gtk_widget_destroy, NULL) –

0

यहां दी गई विधि है। क्योंकि मैं ++ सी पर

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 उपयोग कर रहा हूँ इस कोई है जो gtkmm और ग का उपयोग कर रहे ++ में मदद मिलेगी।

धन्यवाद

0

यह एक मेरे लिए काम किया है (यह खोलना के जवाब का एक परिवर्तन हो):

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

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

(GTKMM 2.4)

संबंधित मुद्दे