C gtk处理列表存储树视图中的事件

C gtk处理列表存储树视图中的事件,c,linux,gtk,C,Linux,Gtk,我的代码如下 #include <gtk/gtk.h> #include <glib.h> #include <stdlib.h> GtkWidget *scrolledwindow; struct param { GtkWidget*parent; GtkWidget*newChild; }; GtkWidget * init_tree(); GtkWidget * init_tree2(); stat

我的代码如下

   #include <gtk/gtk.h>
    #include <glib.h>
    #include <stdlib.h>
    GtkWidget *scrolledwindow;

    struct param
{
    GtkWidget*parent;
    GtkWidget*newChild;
};
GtkWidget * init_tree();
GtkWidget * init_tree2();
static void destroy(GtkWidget *widget, gpointer data)
{
  gtk_main_quit();
}

static void replace_tab(GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data)
{
      struct param* parameters = (struct param*)user_data;
      gtk_container_remove(GTK_CONTAINER(parameters->parent), (GtkWidget*)tree_view);
      gtk_container_add(GTK_CONTAINER(parameters->parent), init_tree2()/*parameters->newChild*/);
}


    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, "Mandriva", -1);
        gtk_list_store_append(liststore, &treeiter);
        gtk_list_store_set(liststore, &treeiter, 0, "Aptosid", -1);
        gtk_list_store_append(liststore, &treeiter);
        gtk_list_store_set(liststore, &treeiter, 0, "OpenSuSE", -1);
        gtk_list_store_append(liststore, &treeiter);
        gtk_list_store_set(liststore, &treeiter, 0, "Linux Mint", -1);
        gtk_list_store_append(liststore, &treeiter);
        gtk_list_store_set(liststore, &treeiter, 0, "Arch Linux", -1);
        gtk_list_store_append(liststore, &treeiter);
        gtk_list_store_set(liststore, &treeiter, 0, "Mandriva", -1);
        gtk_list_store_append(liststore, &treeiter);
        gtk_list_store_set(liststore, &treeiter, 0, "Aptosid", -1);
        gtk_list_store_append(liststore, &treeiter);
        gtk_list_store_set(liststore, &treeiter, 0, "OpenSuSE", -1);
        gtk_list_store_append(liststore, &treeiter);
        gtk_list_store_set(liststore, &treeiter, 0, "Linux Mint", -1);
        gtk_list_store_append(liststore, &treeiter);
        gtk_list_store_set(liststore, &treeiter, 0, "Arch Linux", -1);
     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("Distributions",
                                                                                     cellrenderertext,
                                                                                     "text", 0,
                                                                                     NULL);
        gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), treeviewcolumn);

        return treeview;
    }

    GtkWidget * init_tree2()
    {

        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, "a", -1);
        gtk_list_store_append(liststore, &treeiter);
        gtk_list_store_set(liststore, &treeiter, 0, "b", -1);
        gtk_list_store_append(liststore, &treeiter);
        gtk_list_store_set(liststore, &treeiter, 0, "c", -1);
        gtk_list_store_append(liststore, &treeiter);
        gtk_list_store_set(liststore, &treeiter, 0, "d", -1);
        gtk_list_store_append(liststore, &treeiter);
        gtk_list_store_set(liststore, &treeiter, 0, "e", -1);
        gtk_list_store_append(liststore, &treeiter);
        gtk_list_store_set(liststore, &treeiter, 0, "f", -1);
        gtk_list_store_append(liststore, &treeiter);
        gtk_list_store_set(liststore, &treeiter, 0, "Aptosid", -1);
     gtk_list_store_append(liststore, &treeiter);
        gtk_list_store_set(liststore, &treeiter, 0, "OpenSuSE", -1);
        gtk_list_store_append(liststore, &treeiter);
        gtk_list_store_set(liststore, &treeiter, 0, "Linux Mint", -1);

    gtk_list_store_append(liststore, &treeiter);
        gtk_list_store_set(liststore, &treeiter, 0, "Arch Linux", -1);

        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("Distributions",
                                                                                     cellrenderertext,
                                                                                     "text", 0,
                                                                                     NULL);
        gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), treeviewcolumn);

        return treeview;
    }

    int main(int argc, char *argv[])
    {
      gtk_init(&argc, &argv);

      GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
      gtk_window_set_default_size(GTK_WINDOW(window), 200, 200);
      g_signal_connect(window, "destroy", G_CALLBACK(destroy), NULL);

      GtkWidget *notebook = gtk_notebook_new();
      gtk_container_add(GTK_CONTAINER(window), notebook);


      int count;
      gchar *text;

      for (count = 1; count <= 5; count++)
        {
          GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
          text = g_strdup_printf("Page %d", count);
    GtkWidget *label = gtk_label_new(text);
          GtkWidget *scrolledwindow = gtk_scrolled_window_new(NULL, NULL);

          gtk_widget_set_size_request(scrolledwindow, -1, 200);

          gtk_container_add(GTK_CONTAINER(vbox), scrolledwindow);
          GtkWidget *textview = gtk_text_view_new();
          /* gtk_container_add(GTK_CONTAINER(scrolledwindow), textview); */
          GtkWidget* treeview = init_tree();
          GtkWidget* treeview2 = init_tree2();
struct param* parameters = malloc(sizeof(struct param));
      parameters->parent = scrolledwindow;
      parameters->newChild= treeview2;
          g_signal_connect(treeview, "row-activated", G_CALLBACK(replace_tab),(gpointer)parameters);
          gtk_container_add(GTK_CONTAINER(scrolledwindow), treeview);

          gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, label);
        }

      gtk_widget_show_all(window);

      gtk_main();

      return 0;
    }
#包括
#包括
#包括
GtkWidget*滚动窗口;
结构参数
{
GtkWidget*父项;
GtkWidget*新儿童;
};
GtkWidget*初始化树();
GtkWidget*初始化树2();
静态无效销毁(GtkWidget*小部件,gpointer数据)
{
gtk_main_quit();
}
静态无效替换选项卡(GtkTreeView*树视图、GtkTreePath*路径、GtkTreeViewColumn*列、gpointer用户数据)
{
struct param*参数=(struct param*)用户_数据;
gtk_容器移除(gtk_容器(参数->父级),(GtkWidget*)树视图);
gtk_容器添加(gtk_容器(参数->父级),init_tree2()/*参数->新子级*/);
}
GtkWidget*init_树()
{
GtkListStore*liststore=gtk_list_store_new(1,G_TYPE_字符串);
GtkTreeIter treeiter;
gtk_列表_存储_附加(列表存储和树存储);
gtk列表存储集(liststore和treeiter,0,“Mandriva”,-1);
gtk_列表_存储_附加(列表存储和树存储);
gtk_列表_存储_集(liststore和treeiter,0,“Aptosid”,-1);
gtk_列表_存储_附加(列表存储和树存储);
gtk列表存储集(liststore和treeiter,0,“OpenSuSE”,-1);
gtk_列表_存储_附加(列表存储和树存储);
gtk列表存储集(liststore和treeiter,0,“LinuxMint”,-1);
gtk_列表_存储_附加(列表存储和树存储);
gtk列表存储集(liststore和treeiter,0,“ArchLinux”,-1);
gtk_列表_存储_附加(列表存储和树存储);
gtk列表存储集(liststore和treeiter,0,“Mandriva”,-1);
gtk_列表_存储_附加(列表存储和树存储);
gtk_列表_存储_集(liststore和treeiter,0,“Aptosid”,-1);
gtk_列表_存储_附加(列表存储和树存储);
gtk列表存储集(liststore和treeiter,0,“OpenSuSE”,-1);
gtk_列表_存储_附加(列表存储和树存储);
gtk列表存储集(liststore和treeiter,0,“LinuxMint”,-1);
gtk_列表_存储_附加(列表存储和树存储);
gtk列表存储集(liststore和treeiter,0,“ArchLinux”,-1);
GtkWidget*treeview=gtk_tree_view_new_with_model(gtk_tree_model(liststore));
GtkCellRenderer*CellRenderText=gtk_cell_renderer_text_new();
GtkTreeViewColumn*treeviewcolumn=gtk_tree_view_column_new_,带有_属性(“分布”),
CellRenderText,
“文本”,0,
无效);
gtk树视图附加列(gtk树视图(treeview),treeview列);
返回树视图;
}
GtkWidget*init_tree2()
{
GtkListStore*liststore=gtk_list_store_new(1,G_TYPE_字符串);
GtkTreeIter treeiter;
gtk_列表_存储_附加(列表存储和树存储);
gtk列表存储集(liststore和treeiter,0,“a”,-1);
gtk_列表_存储_附加(列表存储和树存储);
gtk列表存储集(liststore和treeiter,0,“b”,-1);
gtk_列表_存储_附加(列表存储和树存储);
gtk列表存储集(liststore和treeiter,0,“c”,-1);
gtk_列表_存储_附加(列表存储和树存储);
gtk列表存储集(liststore和treeiter,0,“d”,-1);
gtk_列表_存储_附加(列表存储和树存储);
gtk列表存储集(liststore和treeiter,0,“e”,-1);
gtk_列表_存储_附加(列表存储和树存储);
gtk列表存储集(liststore和treeiter,0,“f”,-1);
gtk_列表_存储_附加(列表存储和树存储);
gtk_列表_存储_集(liststore和treeiter,0,“Aptosid”,-1);
gtk_列表_存储_附加(列表存储和树存储);
gtk列表存储集(liststore和treeiter,0,“OpenSuSE”,-1);
gtk_列表_存储_附加(列表存储和树存储);
gtk列表存储集(liststore和treeiter,0,“LinuxMint”,-1);
gtk_列表_存储_附加(列表存储和树存储);
gtk列表存储集(liststore和treeiter,0,“ArchLinux”,-1);
GtkWidget*treeview=gtk_tree_view_new_with_model(gtk_tree_model(liststore));
GtkCellRenderer*CellRenderText=gtk_cell_renderer_text_new();
GtkTreeViewColumn*treeviewcolumn=gtk_tree_view_column_new_,带有_属性(“分布”),
CellRenderText,
“文本”,0,
无效);
gtk树视图附加列(gtk树视图(treeview),treeview列);
返回树视图;
}
int main(int argc,char*argv[])
{
gtk_init(&argc,&argv);
GtkWidget*window=gtk_window_new(gtk_window_TOPLEVEL);
gtk_窗口设置默认大小(gtk_窗口(窗口),200200);
g_信号连接(窗口,“销毁”,g_回调(销毁),空);
GtkWidget*notebook=gtk_notebook_new();
gtk_容器添加(gtk_容器(窗口)、笔记本);
整数计数;
gchar*文本;
对于(计数=1;计数父项=滚动窗口;
参数->newChild=treeview2;
g_信号连接(树状视图,“行激活”,g_回调(替换选项卡),(gpointer)参数);
gtk_容器添加(gtk_容器(滚动窗口),树状视图);
gtk_笔记本_附加_页面(gtk_笔记本(笔记本)、vbox、标签);
}
gtk_小部件_全部显示(窗口);
gtk_main();
返回0;
}
我有两个liststore实例treview1和treeview2。 第一个-显示treeview 1。双击任何liststore项目时,它会生成“行激活”信号。该信号与带有G_回调的函数“替换_选项卡”链接。 func“replace_tab”接受4个参数-父窗口小部件、要从父窗口小部件中删除的窗口小部件、要添加到父窗口小部件和gpointer数据。如何将参数传递给此func。或者解决方案是否有其他方法。

#include <gtk/gtk.h> #include <glib.h> #include <stdlib.h> GtkWidget * init_tree(); GtkWidget * init_tree2(); GtkWidget *scrolledwindow; struct param { GtkWidget*parent; GtkWidget*newChild; }; static void destroy(GtkWidget *widget, gpointer data) { gtk_main_quit(); } static void replace_tab(GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data) { struct param* parameters = (struct param*)user_data; gtk_container_remove(GTK_CONTAINER(parameters->parent), (GtkWidget*)tree_view); gtk_container_add(GTK_CONTAINER(parameters->parent), init_tree2()/*parameters->newChild*/); gtk_widget_show_all (GTK_WIDGET(parameters->parent)); } 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, "Mandriva", -1); gtk_list_store_append(liststore, &treeiter); gtk_list_store_set(liststore, &treeiter, 0, "Aptosid", -1); gtk_list_store_append(liststore, &treeiter); gtk_list_store_set(liststore, &treeiter, 0, "OpenSuSE", -1); gtk_list_store_append(liststore, &treeiter); gtk_list_store_set(liststore, &treeiter, 0, "Linux Mint", -1); gtk_list_store_append(liststore, &treeiter); gtk_list_store_set(liststore, &treeiter, 0, "Arch Linux", -1); gtk_list_store_append(liststore, &treeiter); gtk_list_store_set(liststore, &treeiter, 0, "Mandriva", -1); gtk_list_store_append(liststore, &treeiter); gtk_list_store_set(liststore, &treeiter, 0, "Aptosid", -1); gtk_list_store_append(liststore, &treeiter); gtk_list_store_set(liststore, &treeiter, 0, "OpenSuSE", -1); gtk_list_store_append(liststore, &treeiter); gtk_list_store_set(liststore, &treeiter, 0, "Linux Mint", -1); gtk_list_store_append(liststore, &treeiter); gtk_list_store_set(liststore, &treeiter, 0, "Arch Linux", -1); 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("Distributions", cellrenderertext, "text", 0, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), treeviewcolumn); return treeview; } GtkWidget * init_tree2() { 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, "a", -1); gtk_list_store_append(liststore, &treeiter); gtk_list_store_set(liststore, &treeiter, 0, "b", -1); gtk_list_store_append(liststore, &treeiter); gtk_list_store_set(liststore, &treeiter, 0, "c", -1); gtk_list_store_append(liststore, &treeiter); gtk_list_store_set(liststore, &treeiter, 0, "d", -1); gtk_list_store_append(liststore, &treeiter); gtk_list_store_set(liststore, &treeiter, 0, "e", -1); gtk_list_store_append(liststore, &treeiter); gtk_list_store_set(liststore, &treeiter, 0, "f", -1); gtk_list_store_append(liststore, &treeiter); gtk_list_store_set(liststore, &treeiter, 0, "Aptosid", -1); gtk_list_store_append(liststore, &treeiter); gtk_list_store_set(liststore, &treeiter, 0, "OpenSuSE", -1); gtk_list_store_append(liststore, &treeiter); gtk_list_store_set(liststore, &treeiter, 0, "Linux Mint", -1); gtk_list_store_append(liststore, &treeiter); gtk_list_store_set(liststore, &treeiter, 0, "Arch Linux", -1); 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("Distributions", cellrenderertext, "text", 0, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), treeviewcolumn); return treeview; } int main(int argc, char *argv[]) { gtk_init(&argc, &argv); GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_default_size(GTK_WINDOW(window), 200, 200); g_signal_connect(window, "destroy", G_CALLBACK(destroy), NULL); GtkWidget *notebook = gtk_notebook_new(); gtk_container_add(GTK_CONTAINER(window), notebook); int count; gchar *text; for (count = 1; count <= 5; count++) { GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); text = g_strdup_printf("Page %d", count); GtkWidget *label = gtk_label_new(text); GtkWidget *scrolledwindow = gtk_scrolled_window_new(NULL, NULL); gtk_widget_set_size_request(scrolledwindow, -1, 200); gtk_container_add(GTK_CONTAINER(vbox), scrolledwindow); GtkWidget* treeview = init_tree(); GtkWidget* treeview2 = init_tree2(); struct param* parameters = malloc(sizeof(struct param)); parameters->parent = scrolledwindow; parameters->newChild= treeview2; g_signal_connect(treeview, "row-activated", G_CALLBACK(replace_tab), parameters); gtk_container_add(GTK_CONTAINER(scrolledwindow), treeview); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, label); } gtk_widget_show_all(window); gtk_main(); return 0; }