加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 03:43:28 所属栏目:百科 来源:网络整理
导读:我遇到了GTK C应用程序的问题.我有一个容器,在启动应用程序时,包含一个按钮.在运行期间,用户交互必须使此小部件包含更多这些小部件. 我需要编写一个删除所有“旧”内部按钮的函数,然后从列表中添加所有按钮,最后刷新视图.这就是我写的,但缺少一些部分(TODO)
我遇到了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,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是基于事件的,并且将子项添加到容器使容器意识到需要自动刷新其视觉外观.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读