2010-05-24 67 views

回答

2

你应该能够去通过一个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); 

注意:我没有测试过上面的代码,但我确定我在真实代码中做了非常类似的事情。

1

这里是我如何做到这一点现在,但似乎笨拙...

C的例子:

void get_iter_last(GtkTreeModel *mdl, GtkTreeIter *itr) 
{ 
    GtkTreeIter i; 
    if (gtk_tree_model_get_iter_first(mdl, &i)) { 
    while (gtk_tree_model_iter_next(mdl, &i)) { 
     *itr = i; 
    } 
    } 
}

Python的例子:

def get_iter_last(mdl): 
    itr = mdl.get_iter_first() 
    last = None 
    while itr: 
    last = itr 
    itr = mdl.iter_next(itr) 
    return last
2

即使退卷的答案是正确的,足以把我在正确的轨道上,我想我会加入我的最终解决方案,只是为了完整起见:

的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:

/** 
* Set itr_last to last item of parent if parent has any rows. 
* If parent is NULL, set itr_last to last root row. 
* Returns TRUE if itr_last could be set, otherwise FALSE. 
*/ 
gboolean model_get_iter_last(GtkTreeModel *model, 
           GtkTreeIter *itr_last, 
           GtkTreeIter *parent) 
{ 
    gboolean success; 
    gint n; 

    if (n = gtk_tree_model_iter_n_children(model, parent)) { 
    success = gtk_tree_model_iter_nth_child(model, itr_last, parent, n - 1); 
    } 
    else { 
    itr_last = NULL; 
    success = FALSE; 
    } 
    return success; 
} 
2

感谢所有以前的答案,但我相信,最终的解决方案应该包括TreeModel的(与TreeStore)可以存储与嵌套的多层次项目(例如。路径(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 

甚至更​​短的形式:

def get_last_iter (self, model): 
    iter = None 
    n = 0 
    while 1: 
     iter = model.iter_nth_child (iter, n - 1) 
     n = model.iter_n_children (iter) 
     if n == 0: 
      return iter 
相关问题