使用g_object_ref()重用小部件

时间:2014-11-13 20:08:36

标签: c++ c widget gtk

我有一个GtkGrid,我想根据用户的选择在一个单元格内部显示一个小部件或另一个。我根据this编写了我的代码,其中说:

  

从容器中删除小部件。小部件必须在容器内。 注意   该容器将拥有对widget的引用,并且这可能是   最后一次参考;所以从容器中删除小部件可以   销毁该小部件。如果您想再次使用小部件,则需要添加   使用时,它不在容器内的引用   的 g_object_ref()即可。如果您不想再次使用小部件,通常是这样   更有效地直接使用它来销毁它   gtk_widget_destroy()因为这会将它从容器中删除   帮助打破任何循环引用计数周期。

以下是代码的一些片段:

// Definitions
GtkWidget *myList1, *myList2;

// Creation
myList1 = gtk_tree_view_new();
myList2 = gtk_tree_view_new();
gtk_grid_attach(GTK_GRID(gridList), myList1, 0, 1, 2, 1); // Attach myList1

// Switching in runtime
if (x) {
    g_object_ref(myList1);
    gtk_container_remove(GTK_CONTAINER(gridList), myList1);
    gtk_grid_attach(GTK_GRID(gridList), myList2, 0, 1, 2, 1);
} else {
    g_object_ref(myList2);
    gtk_container_remove(GTK_CONTAINER(gridList), myList2);
    gtk_grid_attach(GTK_GRID(gridList), myList1, 0, 1, 2, 1);   
}

当我执行切换时(我想删除myList1并插入myList2),然后我的网格中出现一个空单元格。无论如何,当我重复切换时,对象myList1会根据需要重新出现在网格中。

在这些操作过程中,我没有在终端上收到任何GTK警告。根据两个单选按钮的选择,x被正确设置为truefalse

发生了什么?我错过了一些段落吗?

1 个答案:

答案 0 :(得分:1)

您需要gtk_widget_show_all(myList2)才能显示该内容。显示GtkWindow GtkGind的GtkWind的gtk_widget_show_all()只会在通话时显示孩子

你的代码有一个潜在的错误:引用计数总是递增2但递减1,因为gtk_grid_attach()(实际gtk_widget_set_parent())自己做g_object_ref()(实际上g_object_ref_sink() })。