删除GTK +容器子项,重新填充它,然后刷新
问题描述:
我遇到了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...
}
希望有人能帮忙,谢谢!
答
删除所有的孩子:
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 +是基于事件的,并且向容器添加子项使容器意识到需要自动刷新其视觉外观。
答
这里是我遵循的方法。因为我使用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++的人。
感谢
答
对我来说这一次的工作(这是开卷的答案的变化):
Glib::ListHandle<Widget*> childList = this->get_children();
Glib::ListHandle<Widget*>::iterator it = childList.begin();
while (it != childList.end()) {
remove(*(*it));
it++;
}
(gtkmm的2.4)
谢谢你,我肯定需要刷新。 – TheUnexpected 2012-02-09 11:10:21
您也可以这样做: gtk_container_foreach(GTK_CONTAINER(container),(GtkCallback)gtk_widget_destroy,NULL) – 2017-06-30 07:44:49