我有一个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不是,所以我假设没有选择该行。为什么呢?
答案 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);
当然,当我以编程方式选择行时会发生此错误,因为无法选择折叠行的子项单击它。