gpt4 book ai didi

C Gtk 问题 : Adding a VBox to the Main Window

转载 作者:行者123 更新时间:2023-12-03 04:44:36 25 4
gpt4 key购买 nike

我正在使用 GTK 库作为界面编写一个 C 游戏。这个想法是有两个主要容器:一个用于容纳按钮和其他小部件,让用户选择设置,另一个用于在实际游戏过程中显示和移动图像。我使用 VBox 来保存菜单小部件,并使用固定容器来保存游戏 Sprite 。我这里有与 main() 方法中的 VBox 和固定容器相关的所有代码行:

GtkWidget* vbox;
GtkWidget* fixed;
...
int main(int argc, char** argv) {
// (The rest of this code block is in the main method)
...
// Make a vertical box for the menu widgets.
vbox = gtk_vbox_new(TRUE, 0);

// Add the menu widgets to the vbox.
gtk_box_pack_start(GTK_BOX(vbox), label1, TRUE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(vbox), button1, TRUE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(vbox), button2, TRUE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(vbox), entry, TRUE, TRUE, 0);

// Make a new fixed container, which allows its children
// widgets to be moved dynamically.
fixed = gtk_fixed_new();

// Add the game widgets to the fixed container.
gtk_fixed_put(GTK_FIXED(fixed), player1, x, y);
gtk_fixed_put(GTK_FIXED(fixed), player2, x, y + 40);
gtk_fixed_put(GTK_FIXED(fixed), ball, x + 80, y);
gtk_fixed_put(GTK_FIXED(fixed), wall, x + 120, y);

// Add the fixed container to the window.
gtk_container_add(GTK_CONTAINER(window), vbox);

gtk_widget_show(vbox);
gtk_widget_show(fixed);

在我的按钮操作之一中,我有以下操作来启动游戏:

gtk_container_remove(GTK_CONTAINER(window), vbox);
gtk_container_add(GTK_CONTAINER(window), fixed);

没有任何问题。但是,在满足某个条件后,我调用了另一个函数,它执行相反的操作:

gtk_container_remove(GTK_CONTAINER(window), fixed);
gtk_container_add(GTK_CONTAINER(window), vbox);

这会导致以下问题:

(a.out:11762): Gtk-CRITICAL **: IA__gtk_container_add: assertion `GTK_IS_WIDGET (widget)' failed

我查看了小部件层次结构,并验证了 VBox 属于 GtkWidget 类别。当我最初在 main() 方法中将 VBox 添加到窗口时,并没有出现上述错误。在调用 gtk_main() 后将此容器添加到窗口时,是否有一些我不知道的事情?

最佳答案

问题是 GtkWidgets 是引用计数的,但你不拥有任何引用。这对于 GtkWidgets 来说很常见,因为只要小部件可见,窗口系统就会保留对它们的一个引用。但只要您将小部件从其容器中删除,引用计数就会降至零并被销毁。

它第一次工作是因为有一个 float 引用,该引用在首次创建小部件后就存在。

最简单的解决方案就是保存对两个移动小部件的引用:在创建它们之后调用 g_object_ref_sink 将 float 引用转换为真实的引用。但使用完后不要忘记调用 g_object_unref!

其他选项是在移动计数器时增加/减少计数器,但您仍然需要将引用沉入 fixed 才能按预期工作:

g_object_ref_sink(fixed);

然后:

g_object_ref(vbox);
gtk_container_remove(GTK_CONTAINER(window), vbox);
gtk_container_add(GTK_CONTAINER(window), fixed);
g_object_unref(fixed);

还有:

g_object_ref(fixed);
gtk_container_remove(GTK_CONTAINER(window), fixed);
gtk_container_add(GTK_CONTAINER(window), vbox);
g_object_unref(vbox);

关于C Gtk 问题 : Adding a VBox to the Main Window,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8776216/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com