C 拆下GTK+;容器子对象,重新填充它,然后刷新
我遇到了GTK+C应用程序的问题。我有一个容器,当启动应用程序时,它包含一个按钮。在运行过程中,用户交互必须导致此小部件包含更多用户交互。C 拆下GTK+;容器子对象,重新填充它,然后刷新,c,gtk,refresh,widget,C,Gtk,Refresh,Widget,我遇到了GTK+C应用程序的问题。我有一个容器,当启动应用程序时,它包含一个按钮。在运行过程中,用户交互必须导致此小部件包含更多用户交互。 我需要编写一个函数,删除所有“旧”内部按钮,然后从列表中添加所有按钮,最后刷新视图。这就是我正在写的内容,但缺少一些部分(待办事项) 希望有人能帮忙,谢谢 删除所有子项: GList *children, *iter; children = gtk_container_get_children(GTK_CONTAINER(container)); for(
我需要编写一个函数,删除所有“旧”内部按钮,然后从列表中添加所有按钮,最后刷新视图。这就是我正在写的内容,但缺少一些部分(待办事项) 希望有人能帮忙,谢谢 删除所有子项:
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\u container\u remove()
),这是并符合您的意图,因此我认为这是可以的
“刷新视图”没有任何意义,只要您将新构建的小部件添加并显示到容器中即可。GTK+是基于事件的,向容器中添加子容器会使容器意识到它需要自动刷新其视觉外观。以下是我遵循的方法。因为我在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++的人有帮助。
谢谢这一条对我有效(这是unwind答案的变体):
Glib::ListHandle childList=this->get_children();
Glib::ListHandle::iterator it=childList.begin();
while(it!=childList.end()){
删除(*(*它));
it++;
}
(GTKMM 2.4)谢谢你,我确信它需要更新。你也可以这样做:gtk_container_foreach(gtk_container(container),(GtkCallback)gtk_widget_destroy,NULL)谢天谢地,这个丑陋的附加API在
GTKMM
3中被删除了,因为它看起来非常不直观,至少从container.get_children()
的视角来看是如此(必须)返回非所属指针。Gtk::manage()
d小部件有一个主要的警告:Container.remove()
不会破坏小部件,假设它是一个典型的小部件,最初有一个来自C库的浮动引用。相反,gtkmm
会恢复浮动引用。因此,如果manage()
a widget&稍后将其从其父级中删除,它将保持活动状态,并带有一个浮动引用。这意味着,如果您希望删除该widget以GTK+中的方式释放该widget,那么您就错了&可能会导致大内存泄漏。因此,您必须remove()
和删除
,但既然删除
将删除()
,您就应该删除
VBox *vboxImgLst;
Glib::ListHandle<Widget*> childList = this->get_children();
Glib::ListHandle<Widget*>::iterator it = childList.begin();
while (it != childList.end()) {
remove(*(*it));
it++;
}