Gtktreeview链表和树型存储结构

来源:互联网 发布:淘宝双11报名 编辑:程序博客网 时间:2024/06/05 09:47

[cpp] view plain copy
  1. /*File:tree.c  
  2.  *Auth:sjin 
  3.  *Date:2014-03-23 
  4.  *Mail:413977243@qq.com 
  5.  */  
  6. #include <gtk/gtk.h>  
  7.   
  8. enum{  
  9.     ID_COLUMN,  
  10.     TOGGLE_COLUMN,  
  11.     TEXT_COLUMN,  
  12.     N_COLUMN  
  13. };  
  14.   
  15. typedef struct _listitem ListItem;  
  16.   
  17. struct _listitem{  
  18.     gint id;  
  19.     gboolean toggle;  
  20.     const gchar *text;  
  21. };  
  22.   
  23. ListItem t[5] = {  
  24.     {1,TRUE,"小明"},  
  25.     {2,FALSE,"大宝"},  
  26.     {3,TRUE,"测试用名称"},  
  27.     {4,FALSE,"显示的文本"},  
  28.     {5,TRUE,"是可编辑的"}  
  29. };  
  30.   
  31. GtkListStore * create_list_model(void)  
  32. {  
  33.     GtkListStore *list_store;  
  34.     GtkTreeIter iter;  
  35.     gint i;  
  36.      
  37.     /*创建一个存储,行数和对应的数据类型列表*/  
  38.     list_store = gtk_list_store_new(N_COLUMN,G_TYPE_INT,G_TYPE_BOOLEAN,G_TYPE_STRING);  
  39.     for(i = 0;i < 5;i++){  
  40.         /*向LIST_trore添加一个新行 
  41.          * iter将指向这个新行,这个函数调用后事空的 
  42.          * 需要gtk_list_store_set()函数来填写数值 
  43.          * */  
  44.         gtk_list_store_append(list_store,&iter);  
  45.         gtk_list_store_set(list_store,&iter,ID_COLUMN,t[i].id,  
  46.                            TOGGLE_COLUMN,t[i].toggle,  
  47.                            TEXT_COLUMN,t[i].text,  
  48.                            -1);  
  49.     }  
  50.   
  51.     return list_store;  
  52. }  
  53.   
  54. GtkWidget* create_list(GtkListStore* list_store)  
  55. {  
  56.     GtkWidget* view;  
  57.     GtkTreeModel* model;  
  58.     GtkCellRenderer* renderer;  
  59.     GtkTreeViewColumn* column;  
  60.   
  61.     model = GTK_TREE_MODEL(list_store);  
  62.     /*创建一个模型初始化model的控件*/  
  63.     view  = gtk_tree_view_new_with_model(model);  
  64.       
  65.     /*创建一个文本单元绘制器*/  
  66.     renderer = gtk_cell_renderer_text_new();  
  67.     /*创建一个视图列表*/  
  68.     column = gtk_tree_view_column_new_with_attributes("数字",renderer,"text",ID_COLUMN,NULL);  
  69.     /*附加一列列表*/  
  70.     gtk_tree_view_append_column(GTK_TREE_VIEW(view),column);  
  71.   
  72.     /*创建一个开关单元绘制器*/  
  73.     renderer = gtk_cell_renderer_toggle_new();  
  74.     /*设置控件属性*/  
  75.     g_object_set(G_OBJECT(renderer),"activatable",TRUE,NULL);  
  76.     /*设置开关单元绘制器为:当为TURE时为单元按钮,为FAULE时为多选按钮*/  
  77.     gtk_cell_renderer_toggle_set_radio(GTK_CELL_RENDERER_TOGGLE(renderer),TRUE);  
  78.     /**/  
  79.     column = gtk_tree_view_column_new_with_attributes("按钮",renderer,"active",TOGGLE_COLUMN,NULL);  
  80.     gtk_tree_view_append_column(GTK_TREE_VIEW(view),column);  
  81.       
  82.     renderer = gtk_cell_renderer_text_new();  
  83.     g_object_set(G_OBJECT(renderer),"editable",TRUE,NULL);  
  84.     column = gtk_tree_view_column_new_with_attributes("文本",renderer,"text",TEXT_COLUMN,NULL);  
  85.     gtk_tree_view_append_column(GTK_TREE_VIEW(view),column);  
  86.     return view;  
  87. }  
  88.   
  89. void show_list(void)  
  90. {  
  91.     GtkWidget* window;  
  92.     GtkWidget* frame;  
  93.     GtkWidget* view;  
  94.     GtkListStore* model;  
  95.       
  96.     window = gtk_window_new(GTK_WINDOW_TOPLEVEL);  
  97.     g_signal_connect(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),window);  
  98.     gtk_window_set_title(GTK_WINDOW(window),"TREEVIEW --使用 LISTSTORE");  
  99.     gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);  
  100.     gtk_container_set_border_width(GTK_CONTAINER(window),10);  
  101.       
  102.     frame = gtk_frame_new("可编辑的列表");  
  103.     gtk_frame_set_label_align(GTK_FRAME(frame),1.0,0);  
  104.     gtk_container_add(GTK_CONTAINER(window),frame);  
  105.       
  106.     /*创建一个存储列表*/  
  107.     model = create_list_model();  
  108.     /*创建单元格列表*/  
  109.     view = create_list(model);  
  110.       
  111.     gtk_container_add(GTK_CONTAINER(frame),view);  
  112.       
  113.     gtk_widget_show_all(window);  
  114. }  
  115.   
  116. enum {  
  117.     XCLASS_COLUMN,  
  118.     LEADER_COLUMN,  
  119.     STUDENTS_COLUMN,  
  120.     GIRLS_COLUMN  
  121. };  
  122. typedef struct _treeitem TreeItem;  
  123. struct _treeitem{  
  124.     const char* xclass;  
  125.     const char* leader;  
  126.     gint students;  
  127.     gint girls;  
  128. };  
  129.   
  130. TreeItem ti[3] = {  
  131.     {"一年级一班","李晓",40,20},  
  132.     {"一年级二班","张红",44,18},  
  133.     {"一年级三班","刘丽",42,20}  
  134. };  
  135. TreeItem tj[3] = {  
  136.     {"二年级一班","王可",34,16},  
  137.     {"二年级二班","赵倩",34,18},  
  138.     {"二年级三班","犹可",38,20}  
  139. };  
  140.   
  141. GtkTreeStore* create_tree_model(void)  
  142. {  
  143.     GtkTreeStore* treestore;  
  144.     GtkTreeIter iter,parent;  
  145.     gint i;  
  146.   
  147.     /*创建树型存储结构,每行都有一种存储类型*/  
  148.     treestore = gtk_tree_store_new(4,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_INT,G_TYPE_INT);  
  149.     /*向树型存储结构添加新行 
  150.      *iter 指向新行的空间 
  151.      * */  
  152.     gtk_tree_store_append(treestore,&iter,NULL);  
  153.     gtk_tree_store_set(treestore,&iter,0,"一年级",-1);  
  154.   
  155.     gtk_tree_store_append(treestore,&iter,NULL);  
  156.     gtk_tree_store_set(treestore,&iter,0,"二年级",-1);  
  157.   
  158.     /*gboolean gtk_tree_model_get_iter_from_string(GtkTreeModel *treestore, 
  159.      *                                              GtkTreeIter *iter, 
  160.      *                                              const gchar *path_string); 
  161.      *  参数:treestore :存储树形列表 
  162.      *        iter :    指向存储结构 
  163.      *        path_string : 路径 
  164.      *  返回值:TRUE : iter 不为空 
  165.      *          FAule:     为空 
  166.      * 
  167.      */  
  168.   
  169.     if(gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(treestore),&parent,"0")){  
  170.         for(i = 0; i < 3; i++){  
  171.             gtk_tree_store_append(treestore,&iter,&parent);  
  172.             gtk_tree_store_set(treestore,&iter,  
  173.                                XCLASS_COLUMN,ti[i].xclass,  
  174.                                LEADER_COLUMN,ti[i].leader,  
  175.                                STUDENTS_COLUMN,ti[i].students,  
  176.                                GIRLS_COLUMN,ti[i].girls,  
  177.                                -1);  
  178.         }  
  179.     }  
  180.   
  181.     if(gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(treestore),&parent,"1")){  
  182.         for(i = 0; i < 3; i++)  
  183.         {  
  184.             gtk_tree_store_append(treestore,&iter,&parent);  
  185.             gtk_tree_store_set(treestore,&iter,  
  186.                                XCLASS_COLUMN,tj[i].xclass,  
  187.                                LEADER_COLUMN,tj[i].leader,  
  188.                                STUDENTS_COLUMN,tj[i].students,  
  189.                                GIRLS_COLUMN,tj[i].girls,  
  190.                                -1);  
  191.         }  
  192.     }  
  193.   
  194.     return treestore;  
  195. }     
  196.   
  197. GtkWidget* create_tree(GtkTreeStore* treestore)  
  198. {  
  199.     GtkWidget* view;  
  200.     GtkCellRenderer* renderer;  
  201.     GtkTreeViewColumn* column;  
  202.       
  203.     /*创建树型显示模型*/  
  204.     view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(treestore));  
  205.   
  206.     renderer = gtk_cell_renderer_text_new();  
  207.     column = gtk_tree_view_column_new_with_attributes("班级名",renderer,"text",XCLASS_COLUMN,NULL);  
  208.     gtk_tree_view_append_column(GTK_TREE_VIEW(view),column);  
  209.       
  210.     renderer = gtk_cell_renderer_text_new();  
  211.     column = gtk_tree_view_column_new_with_attributes("班主任",renderer,"text",LEADER_COLUMN,NULL);  
  212.     gtk_tree_view_append_column(GTK_TREE_VIEW(view),column);  
  213.       
  214.     renderer = gtk_cell_renderer_text_new();  
  215.     column = gtk_tree_view_column_new_with_attributes("学生总数",renderer,"text",STUDENTS_COLUMN,NULL);  
  216.     gtk_tree_view_append_column(GTK_TREE_VIEW(view),column);  
  217.       
  218.     renderer = gtk_cell_renderer_text_new();  
  219.     column = gtk_tree_view_column_new_with_attributes("女生总数",renderer,"text",GIRLS_COLUMN,NULL);  
  220.     gtk_tree_view_append_column(GTK_TREE_VIEW(view),column);          
  221.     return view;  
  222. }  
  223.   
  224. void show_tree(void)  
  225. {  
  226.     GtkWidget* window;  
  227.     GtkWidget* frame;  
  228.     GtkWidget* view;  
  229.     GtkTreeStore* model;  
  230.       
  231.     window = gtk_window_new(GTK_WINDOW_TOPLEVEL);  
  232.     g_signal_connect(G_OBJECT(window),"destroy",G_CALLBACK(gtk_widget_destroy),window);  
  233.     gtk_window_set_title(GTK_WINDOW(window),"TREEVIEW----使用TreeStore");  
  234.     gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);  
  235.     gtk_container_set_border_width(GTK_CONTAINER(window),10);  
  236.       
  237.     frame = gtk_frame_new("树型列表");  
  238.     gtk_container_add(GTK_CONTAINER(window),frame);  
  239.       
  240.     model = create_tree_model();  
  241.       
  242.     view = create_tree(model);  
  243.       
  244.     gtk_container_add(GTK_CONTAINER(frame),view);  
  245.       
  246.     gtk_widget_show_all(window);  
  247. }  
  248.   
  249. int main(int argc,char* argv[])  
  250. {  
  251.     GtkWidget* window;  
  252.     GtkWidget* vbox;  
  253.     GtkWidget* button;  
  254.   
  255.     /*初始化*/  
  256.     gtk_init(&argc,&argv);  
  257.   
  258.     window = gtk_window_new(GTK_WINDOW_TOPLEVEL);  
  259.     gtk_window_set_title(GTK_WINDOW(window),"TREE_VIEW控件");  
  260.     g_signal_connect(G_OBJECT(window),"delete_event",G_CALLBACK(gtk_main_quit),NULL);  
  261.       
  262.     vbox = gtk_vbox_new(FALSE,0);  
  263.     gtk_container_add(GTK_CONTAINER(window),vbox);  
  264.   
  265.     button = gtk_button_new_with_label("创建列表显示");  
  266.     gtk_box_pack_start(GTK_BOX(vbox),button,FALSE,FALSE,5);  
  267.     g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(show_list),NULL);  
  268.       
  269.     button = gtk_button_new_with_label("创建树型显示");  
  270.     gtk_box_pack_start(GTK_BOX(vbox),button,FALSE,FALSE,5);  
  271.     g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(show_tree),NULL);  
  272.       
  273.     gtk_widget_show_all(window);  
  274.       
  275.     gtk_main();  
  276.       
  277.     return FALSE;  
  278. }  
阅读全文
0 0
原创粉丝点击