我正在使用gtk容器删除,它说容器需要对小部件的引用,但我不确定如何做到这一点,并想知道是否有人可以告诉我如何做到这一点。如果它有助于它是一个按钮小部件,谢谢
答案 0 :(得分:2)
创建窗口小部件时,窗口小部件最初被称为浮动。 "浮动"指对象在创建之后但在某人通过引用声明对其拥有权之前所处的边界。将小部件添加到容器时,容器会调用小部件上的g_object_ref_sink()
以消除浮动状态并获取小部件的引用。在此之后,窗口小部件上的引用计数为1.(如果对象未浮动,g_object_ref_sink()
将仅添加对该对象的引用。)
从容器中删除窗口小部件时,容器会调用g_object_unref()
以删除添加窗口小部件时所引用的引用。但由于该窗口小部件的引用计数为1,因此对g_object_unref()
的调用将引用计数设置为0,并且窗口小部件将被销毁。
因此,如果您需要从其父容器中删除窗口小部件,但仍然保留它(例如,将其放入新容器中),您首先需要自己使用g_object_ref()
获取引用。
例如,要将窗口小部件从一个容器移动到另一个容器,您可以执行
// get a reference on the widget so it stays alive
// I forget when you would want to use g_object_ref_sink() instead
g_object_ref(widget);
// remove the widget
gtk_container_remove(container, widget);
// add it to the other container
gtk_container_add(otherContainer, widget);
// the call to gtk_container_add() took a reference
// we are now done with ours
g_object_unref(widget);