2012-02-08 85 views
5

我遇到了GTK + C應用程序的問題。我有一個容器,它在啓動應用程序時包含一個按鈕。在運行期間,用戶交互必須使這個小部件包含更多這些小部件。
我需要編寫一個刪除所有「舊」內部按鈕的函數,然後添加列表中的所有內容並最終刷新視圖。這是我正在寫的,但一些部分丟失(TODO)刪除GTK +容器子項,重新填充它,然後刷新

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和匹配您的意圖,所以它的罰款在我看來。

只要您實際添加並顯示新構建的小部件到容器中,「刷新視圖」就沒有意義。 GTK +是基於事件的,並且向容器添加子項使容器意識到需要自動刷新其視覺外觀。

+0

謝謝你,我肯定需要刷新。 – TheUnexpected 2012-02-09 11:10:21

+0

您也可以這樣做: gtk_container_foreach(GTK_CONTAINER(container),(GtkCallback)gtk_widget_destroy,NULL) – 2017-06-30 07:44:49

0

這裏是我遵循的方法。因爲我使用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這將有助於誰正在使用的gtkmm和C++的人。

感謝

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)