删除GTK +容器子项,重新填充它,然后刷新

时间:2012-02-08 11:13:45

标签: c gtk refresh widget

我遇到了GTK + C应用程序的问题。我有一个容器,在启动应用程序时,包含一个按钮。在运行期间,用户交互必须使此小部件包含更多内容 我需要编写一个删除所有“旧”内部按钮的函数,然后从列表中添加所有按钮,最后刷新视图。这就是我正在写的,但缺少一些部分(TODO)

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

希望有人能提供帮助,谢谢!

3 个答案:

答案 0 :(得分:12)

删除所有孩子:

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 +是基于事件的,将子项添加到容器使容器意识到需要自动刷新其视觉外观。

答案 1 :(得分:0)

这是我遵循的方法。因为我在c ++上使用gtkmm

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和c ++的人有所帮助。

由于

答案 2 :(得分: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)