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;
}