2012-02-08 18 views
5

Tôi gặp sự cố với ứng dụng GTK + C. Tôi có một container, khi bắt đầu ứng dụng, có chứa một nút. Trong khi chạy một tương tác người dùng phải làm cho widget này chứa nhiều hơn.
Tôi cần viết một hàm xóa tất cả các nút bên trong "cũ", sau đó thêm tất cả các nút trong danh sách và cuối cùng làm mới chế độ xem. Đây là những gì tôi đang viết nhưng một số phần bị thiếu (TODOs)Xóa trẻ em chứa GTK +, lắp lại, sau đó làm mới

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

Hy vọng rằng ai đó có thể giúp, cảm ơn!

Trả lời

10

Loại bỏ tất cả trẻ em:

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

Lưu ý rằng ở trên chỉ xóa mỗi widget con trực tiếp, thay vì hỏi container để xoá bỏ nó (với gtk_container_remove()), đây là recommended by the documentation và phù hợp với những gì bạn có ý định, vì vậy nó tốt trong quan điểm của tôi.

Không có điểm trong "làm mới chế độ xem", miễn là bạn thực sự thêm và hiển thị tiện ích con mới được tạo vào vùng chứa. GTK + là dựa trên sự kiện và việc thêm trẻ em vào vùng chứa làm cho vùng chứa nhận ra rằng nó cần phải tự động làm mới giao diện trực quan của nó.

+0

Cảm ơn bạn, tôi đã chắc chắn rằng nó cần phải làm mới. – TheUnexpected

+0

Bạn cũng có thể làm: gtk_container_foreach (GTK_CONTAINER (vùng chứa), (GtkCallback) gtk_widget_destroy, NULL) –

0

Đây là phương pháp mà tôi đã theo dõi. Bởi vì tôi đang sử dụng gtkmm trên 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); 

nơi vboxImgLst là,

VBox *vboxImgLst; 

Hy vọng điều này sẽ giúp cho những người đang sử dụng gtkmm và C++.

Cảm ơn

0

một này làm việc cho tôi (đó là một biến thể của câu trả lời Thư giãn của):

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

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

(gtkmm 2.4)

Các vấn đề liên quan