Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 拆下GTK+;容器子对象,重新填充它,然后刷新_C_Gtk_Refresh_Widget - Fatal编程技术网

C 拆下GTK+;容器子对象,重新填充它,然后刷新

C 拆下GTK+;容器子对象,重新填充它,然后刷新,c,gtk,refresh,widget,C,Gtk,Refresh,Widget,我遇到了GTK+C应用程序的问题。我有一个容器,当启动应用程序时,它包含一个按钮。在运行过程中,用户交互必须导致此小部件包含更多用户交互。 我需要编写一个函数,删除所有“旧”内部按钮,然后从列表中添加所有按钮,最后刷新视图。这就是我正在写的内容,但缺少一些部分(待办事项) 希望有人能帮忙,谢谢 删除所有子项: GList *children, *iter; children = gtk_container_get_children(GTK_CONTAINER(container)); for(

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

希望有人能帮忙,谢谢

删除所有子项:

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++;
}