如何获得GtkTreePath或GtkTreeIter到GtkTreeModel中的最后一行?

2024-10-01 07:10:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我想要一个GtkTreePath或GtkTreeIter到GtkTreeModel的最后一行,但是GtkTreeModel没有这个函数。在

我很乐意用C语言或Python语言,或两者兼而有之。在


Tags: 函数语言乐意gtktreemodelgtktreeitergtktreepath
3条回答

您应该能够通过GtkTreePath,可能是一个黑客,但仍然在API中:

GtkTreePath *path;
GtkTreeIter iter;

/* With NULL as iter, we get the number of toplevel nodes. */
gint rows = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(model), NULL);

/* Now get a path from the index. */
path = gtk_tree_path_new_from_indices(rows - 1, -1);

/* Ask the model for an iter to the node identified by the path. */
gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &iter, path);

/* Drop the path, we're done with it, iter is final output. */
gtk_tree_path_free(path);

注意:我在编写上面的代码时还没有测试过,但是我很确定我在实际代码中做了一些非常类似的事情。在

尽管unwind的答案是正确的,足以让我走上正轨,但我还是想为了完整起见添加我的最终解决方案:

Python:

def model_get_iter_last( model, parent=None ):
  """Returns a gtk.TreeIter to the last row or None if there aren't any rows.
  If parent is None, returns a gtk.TreeIter to the last root row."""
  n = model.iter_n_children( parent )
  return n and model.iter_nth_child( parent, n - 1 )

C:

^{pr2}$

感谢前面所有的答案,但是我认为最终的解决方案应该包括TreeModel(带TreeStore)可以存储具有多个嵌套级别的项(例如path(2,0,4,2))。“fresh”发布的解决方案对我不起作用,因为我需要一个能够正确遍历所有最后一个子级的函数,直到它真正找到最后一行。以下是我的最终解决方案:

def get_last_iter (self, model):
    n = model.iter_n_children (None)
    # list empty
    if n == 0:
        return None
    else:
        iter = model.iter_nth_child (None, n - 1)
        n = model.iter_n_children (iter)
        # last top-level item has no children, so select that last item
        if n == 0:
            return iter
        else:
            # traverse thru every last child
            while 1:
                iter = model.iter_nth_child (iter, n - 1)
                n = model.iter_n_children (iter)
                if n == 0:
                    return iter

或者更简短的形式:

^{pr2}$

相关问题 更多 >