代码之家  ›  专栏  ›  技术社区  ›  Sagar Mohantu

gtk获取在liststore树视图中单击的项目

  •  2
  • Sagar Mohantu  · 技术社区  · 8 年前

    我想获得在树视图中单击的项目,该项目会导致“行激活”事件。我在树视图中有一个列表存储。单击其中的任何项目都会显示另一个列表。但我怎么知道点击了哪个项目? 我怎么找到它? 代码-

    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);
    
    .....
    }
    
    1 回复  |  直到 8 年前
        1
  •  4
  •   José Fonte    8 年前

    获取 treeview 双击选择( row-activated )是:

    1.使用来自 行已激活 回调

    来自的信号处理程序 信号为:

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

    我们可以从具有暴露变量的模型中检索数据;从 GtkTreePath path 我们得到了 GtkTreeIter iter GtkTreeView treeview 我们可以得到 GtkTreeModel model . 拥有 model iter 我们可以从 模型 ; 例如,在你的 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 (树状图上的单选),我们将使用它从 模型 ; 例如在你的 替换_选项卡 信号处理程序,添加以下内容:

    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 信号由发出 GTK重新选择 .