我想要一个GtkTreePath或GtkTreeIter到GtkTreeModel的最后一行,但GtkTreeModel没有这个功能。如何获取GtkTreePath或GtkTreeIter到GtkTreeModel的最后一行?
我会很高兴与用C或Python,或两者的答案和实例)。
我想要一个GtkTreePath或GtkTreeIter到GtkTreeModel的最后一行,但GtkTreeModel没有这个功能。如何获取GtkTreePath或GtkTreeIter到GtkTreeModel的最后一行?
我会很高兴与用C或Python,或两者的答案和实例)。
你应该能够去通过一个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);
注意:我没有测试过上面的代码,但我确定我在真实代码中做了非常类似的事情。
这里是我如何做到这一点现在,但似乎笨拙...
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
即使退卷的答案是正确的,足以把我在正确的轨道上,我想我会加入我的最终解决方案,只是为了完整起见:
的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;
}
感谢所有以前的答案,但我相信,最终的解决方案应该包括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