GTK-获得点击的liststore树状哪些项目(gtk-get which item is cli

2019-09-26 04:04发布

我想在单击处于引起“行激活”事件树视图中的项目。 我有一个树状列表商店。 点击其中的任何项目显示另一个列表。 但我怎么知道单击的是哪个项目? 如何找到的? 码-

GtkWidget * init_tree()
{

    GtkListStore *liststore = gtk_list_store_new(1, G_TYPE_STRING);
    GtkTreeIter treeiter;

    gtk_list_store_append(liststore, &treeiter);
    gtk_list_store_set(liststore, &treeiter, 0, "Register", -1);
    gtk_list_store_append(liststore, &treeiter);
    gtk_list_store_set(liststore, &treeiter, 0, "New Configuration", -1);
    gtk_list_store_append(liststore, &treeiter);
    gtk_list_store_set(liststore, &treeiter, 0, "Edit Configuration", -1);
    gtk_list_store_append(liststore, &treeiter);
    gtk_list_store_set(liststore, &treeiter, 0, "Delete Configuration", -1);
    gtk_list_store_append(liststore, &treeiter);
    gtk_list_store_set(liststore, &treeiter, 0, "Add location to turn-off place list", -1);
    gtk_list_store_append(liststore, &treeiter);
    gtk_list_store_set(liststore, &treeiter, 0, "Disable Turn-off Places", -1);
    gtk_list_store_append(liststore, &treeiter);
    gtk_list_store_set(liststore, &treeiter, 0, "Enable Turn-off Places", -1);
    gtk_list_store_append(liststore, &treeiter);
    gtk_list_store_set(liststore, &treeiter, 0, "Disable Distance", -1);
    gtk_list_store_append(liststore, &treeiter);
    gtk_list_store_set(liststore, &treeiter, 0, "Enable Distance", -1);
    gtk_list_store_append(liststore, &treeiter);
    gtk_list_store_set(liststore, &treeiter, 0, "Factory Reset", -1);
    gtk_list_store_append(liststore, &treeiter);
    GtkWidget *treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(liststore));

    GtkCellRenderer *cellrenderertext = gtk_cell_renderer_text_new();

    GtkTreeViewColumn *treeviewcolumn = gtk_tree_view_column_new_with_attributes("Settings",
                                                                                 cellrenderertext,
                                                                                 "text", 0,
                                                                                 NULL);
    gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), treeviewcolumn);

    return treeview;
}

static void replace_tab(GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data)
{
..........
}

int main(...)
{
....
g_signal_connect(treeview, "row-activated", G_CALLBACK(replace_tab), (gpointer) parameters);

.....
}

Answer 1:

最常见的方式来获取treeview上双击选择( row-activated )是:

1.从使用变量row-activated回拨

从信号处理程序row-activated信号是:

 void user_function (GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data) 

我们可以从与暴露变量模型检索数据; 从GtkTreePath path ,我们得到GtkTreeIter iter ,并从GtkTreeView treeview我们可以得到GtkTreeModel model 。 具有modeliter ,我们可以从数据model ; 例如。 在replace_tab信号处理程序,添加以下内容:

static void replace_tab(GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data)
{
   gchar *string;
   GtkTreeIter iter;
   GtkTreeModel *model = gtk_tree_view_get_model (tree_view);
   gtk_tree_model_get_iter(model, &iter, path); 
   gtk_tree_model_get (model, &iter, 0, &string, -1);
   g_print ("activated: %s\n", string);
   ...

 }

这应该打印从激活行的文本

2.使用GtkTreeSelection

另一种选择是使用GtkTreeSelection我们可以从检索GtkTreeView本身。 这一步使我们能够提取所选择的iter (树视图单选)与我们将得到从数据model ; 例如,在你的replace_tab信号处理程序,添加以下内容:

static void replace_tab(GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data)
{ 
   gchar *string;
   GtkTreeIter iter;
   GtkTreeSelection *selection;
   GtkTreeModel *model = gtk_tree_view_get_model (tree_view);

   selection = gtk_tree_view_get_selection (tree_view);
   gtk_tree_selection_get_selected (selection, &model, &iter); 
   gtk_tree_model_get (model, &iter, 0, &string, -1);
   g_print ("activated: %s\n", string);
   ...
}

结论:

选项1)它更容易,更清洁,直线前进。 通常为2)它的用于获得经由选择变化changed由发射信号GtkTreeSelection



文章来源: gtk-get which item is clicked in the liststore treeview