我有一个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
被正确设置为true
或false
。
发生了什么?我错过了一些段落吗?
答案 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()
})。