为什么gtk_tree_selection_select_iter()即使在iter有效的情况下也不会选择另一行的子行?

时间:2012-07-18 14:29:23

标签: gtk gtk2 gtktreeview

我有一个sscce的应用程序here代码GtkTreeView。每次选择一行时,都会调用一个回调。此回调应检索所选行并以某种方式处理其数据。

我的应用程序有时必须选择此树视图的某些行:

// Selecting a line
gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(model), &iter, "0");
GtkTreeSelection *selection =
        gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view));
gtk_tree_selection_select_iter(selection, &iter);

当我必须选择一条顶层线,即直接从根线下降的线时,这很有效。但是,如果我尝试选择一个子行(例如第三行的第一个子行),我在回调函数中遇到错误(sscce代码here,只在第42行更改):

// Selecting a line
gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(model), &iter, "2:0");
GtkTreeSelection *selection =
        gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view));
gtk_tree_selection_select_iter(selection, &iter);

错误是以下警告,然后是段错误:

  

(treetest:1843):Gtk-CRITICAL **:gtk_tree_store_get_path:断言`iter-> user_data!= NULL'失败

     

(treetest:1843):Gtk-CRITICAL **:IA__gtk_tree_model_get_string_from_iter:断言`path!= NULL'失败

此外,当我用鼠标选择相同的行时,这个错误永远不会发生。

怎么可能?选定的路径"2:0"有效,但是从选择中返回的iter不是,所以我假设没有选择该行。为什么呢?

1 个答案:

答案 0 :(得分:2)

问题是顶层线是折叠的。它的子行被隐藏,因此无法选择它们。

解决方案是在选择其中一个子代(sscce代码here)之前以progamatically扩展父行:

// Expanding
GtkTreePath *path = gtk_tree_path_new_from_string("2");
gtk_tree_view_expand_row(GTK_TREE_VIEW(tree_view), path, TRUE);
// Selecting a line
gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(model), &iter, "2:0");
GtkTreeSelection *selection =
        gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view));
gtk_tree_selection_select_iter(selection, &iter);

当然,当我以编程方式选择行时会发生此错误,因为无法选择折叠行的子项单击它。