Gtk3 - 如何在其容器中获取小部件的索引?

时间:2016-09-06 18:27:28

标签: c widget containers gtk3

我指向位于同一容器(GtkBox)中的两个不同的小部件。我想使用gtk_box_reorder_child(container, widgetToMove, destinationIndex)来将其中一个的容器位置更改为另一个的索引:

GtkWidget *widgetToMove;
GtkWidget *target;
// Does something like 'gtk_get_container_index' exist ?
gint targetIndex = gtk_get_container_index(target) 
gtk_box_reorder_child (myBox,widgetToMove,targetIndex);

...听起来很愚蠢,但是经过15分钟的搜索,我仍然不知道如何在它的容器中获取小部件的索引。

修改:已解决,此处为解决方案

GtkWidget *widgetToMove;
GtkWidget *target;
GValue targetIndex = G_VALUE_INIT;
g_value_init (&targetIndex, G_TYPE_INT);
gtk_container_child_get_property(myBox,target,"position",&targetIndex);
gtk_box_reorder_child (myBox,widgetToMove,g_value_get_int(&targetIndex));

3 个答案:

答案 0 :(得分:2)

容器小部件保存了一堆可以使用container.child_get_property查询的“子属性”。您正在寻找的房产称为“位置”。

答案 1 :(得分:1)

不是一个完整的答案,但没有足够的回复评论。

首先,我要注意gtkBox页面引用了一个“position”子属性,但我老实说我不记得如何访问这样的属性。

我在类似情况下所做的是创建gtkGrid而不是gtkBox,并使用gtk_grid_get_child_at()方法检查从0,0索引开始的每个子节点。您可以使用类似于此

的for循环
for(int n=0;n<numChildren;n++)
{
    gtkWidget* temp = gtk_grid_get_child_at(myGrid, n, 0);
    if(temp == myWidget)
        break;
}
//n now holds the index of myWidget in myGrid

答案 2 :(得分:1)

您可以使用gtk_container_get_children()https://developer.gnome.org/gtk3/stable/GtkContainer.html#gtk-container-get-children),它会返回Glist*https://developer.gnome.org/glib/stable/glib-Doubly-Linked-Lists.html)。 然后,您可以遍历列表,或者,例如,检查您的窗口小部件是否在g_list_find()

列表中