2012-02-08 16 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

削除すべての子供たち:上記はちょうどではなく(gtk_container_remove()で)それを削除するには、コンテナを尋ねるよりも、直接それぞれの子ウィジェットを削除することを

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

注、これはrecommended by the documentationであり、あなたが意図したものと一致するので、それはです私の意見では良い。

新しく構築されたウィジェットを実際にコンテナに追加して表示する限り、「ビューを更新する」の意味はありません。 GTK +はイベントベースであり、コンテナに子を追加すると、コンテナーは視覚的な外観を自動的にリフレッシュする必要があることを認識します。

+0

ありがとう、私はそれがリフレッシュを必要と確信していました。 – TheUnexpected

+0

次の操作も可能です: gtk_container_foreach(GTK_CONTAINER(コンテナ)、(GtkCallback)gtk_widget_destroy、NULL) –

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

上のgtkmmを使用していますのでvboxImgLstが、これはgtkmmのとC++を使用している誰かに役立ちます

VBox *vboxImgLst; 

希望です。この1つは私のために働いた

おかげ

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)

関連する問題