0

我有一个带有. _ 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 代码,仅在第 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:断言“路径!= NULL”失败

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

怎么会这样?选择的路径"2:0"是有效的,但从选择返回的迭代器不是,所以我认为该行没有被选择。为什么?

4

1 回答 1

2

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

一种解决方案是在选择其中一个子行之前以编程方式扩展父行(此处为 sscce 代码):

// 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);

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

于 2012-07-18T14:29:22.883 回答