GtkTreeView用法详解

GtkTreeView⽤法详解
GtkTreeView ⽤法详解(原)
蛇足石杉2010年03⽉06⽇星期六 21:37
硅酸铝耐火纤维毡
在GTK+的所有构件(widget)中,GtkTreeView算是⽐较难的⼀个了,做⼀个完整的GtkTreeView要牵涉到不少其他的构件或对象,对于初次使⽤GtkTreeView的朋友来说,可能有点难度,因此我就我所知道的结合GTK+ API⼿册来给初来乍到的朋友略讲⼀下。希望对正在使⽤Gtk+的朋友有所帮助。你可以在这⾥下载源代码。这是测试程序执⾏的界⾯。
下⾯我们就来讲解如何使⽤GtkTreeView构件
⼀、MVC    ⾸先应该介绍的是MVC这个模式,Model/View/Controller(模式/视图/控制器),GtkTreeView就是按照这样的结构来设计的。这样的好处是,让数据和视图进⾏分离,同⼀份数据可以设计不同的视图来显⽰。如同⼀份数据,我可以在⼀个界⾯中⽤条状图来显⽰,同时⼜可以⽤曲线来显⽰。当你更新你的数据的时候,视图就会⾃动更新来显⽰你的数据变化,所以这部分⼯作就是控制器来完成的了。之所以要讲MVC设计模式的原因就是,我们的GtkTreeView构件就是这么来设计的。所以先了解了这个再来学GtkTreeView,理解就容易多了。⼆、GtkTreeView的组成上⾯我都说了,要使⽤Gtk
TreeView要牵涉到其他不少的构件或对象,因此下⾯我们就来看⼀下在使⽤GtkTreeView时我们⼀共需要哪些构件或对象。1,GtkTreeView              -- 树视图
2,GtkTreeViewColumn    -- 列视图3,GtkCellRenderer          -- 渲染器4,GtkTreeModel            -- 树模式(树状or链表)三、创建⼀个树视图3.1 第⼀步:创建⼀个模式Gtk+提供了两种简单的模式,⼀个是GtkListStore,⼀个是GtkTreeStore。如果你对模式理解还有⼀些困难的话,其实我们完全可以简单的将GtkListStore和GtkTreeStore理解成数据库,它们就是存放我们数据的地⽅。⼀个是存放链式的数据,⼀个是存放树状的数据。我们可以通过下⾯的函数来创建⼀个模式(数据库);
GtkListStore *store;store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_BOOLEAN);
这个函数创建⼀个了⼀个链式的模式,这个链表具有两列。它们分别具有字符串类型和布尔类型,典型的⽤法我们是不会直接使⽤2来标明这个链表的列数的。我们根据Gtk+api⼿册提供的⽅法,创建⼀个模式更好的⽅法是按照下⾯的⽅式来创建:
enum{MYID_COLUMN,TITLE_COLUMN,AUTHOR_COLUMN,STATUS_COLUNM,NBR_COLUMNS};store = gtk_list_store_new(NBR_COLUMNS,      /* NBR_COLUMNS = 4 */G_TYPE_INT,
G_TYPE_STRING,  G_TYPE_STRING, G_TYPE_FLOAT); 3.1 第⼆步:向模式(数据库)中添加数据
当我们创建好了我们的模式之后,我们就可以向其中添加数据了,我们可以通过下⾯的函数和⽅法来向我们的模式中添加数据:GtkTreeIter        iter;    /* 迭代器 */gtk_tree_store_append(store, &iter, NULL);  /* 获取插⼊的位置
*/gtk_tree_store_set(store, &iter,MYID_COLUMN, 1,TITLE_COLUMN, "美丽的⼤草原",AUTHOR_COLUMN, "甲A",-1);注意:最后⼀个参数是-1,因为gtk_tree_store_set()这个函数是⼀个变参数函数,也就是说参数的个数可以改变的,因此需要⼀个-1来标志参数的结束。通过上⾯的语句我们就向模式中添加了⼀⾏数据了。可能你会问iter 是做什么的,从字⾯以上我们可以读成“迭代器”,也正如它的意思(其实我们不⽤管那么多),不⽤知道GtkTreeIter内部结构是怎么样的,我们只需把它看作⽤来标志store的某⼀⾏的⼀个数据就可以了。通过
gtk_tree_store_append这个函数,我们就得到了我们下⼀个可以插⼊数据的位置是什么了,iter就标志了这个位置。我们还可以继续通过这两个函数,不断的望模式中添加数据。在gtk_tree_store_append的第三个参数为NULL表⽰获取顶层的迭代器iter.我们也可以获取某⼀迭代器的迭代器。如:gtk_tree_store_append (store,
&iter1, NULL); /* 获取顶层的迭代器iter */gtk_tree_store_set (store, &iter1,TITLE_COLUMN, "我的分类
1",AUTHOR_COLUMN, "",CHECKED_COLUMN, FALSE,-1);gtk_tree_store_append (store, &iter2, &iter1); /* 获取⼦迭代器 */gtk_tree_store_set (store, &iter2,TITLE_COLUMN, "我的标题1",-1);gtk_tree_store_append (store, &iter2, &iter1);gtk_tree_store_set (store, &iter2,TITLE_COLUMN, "我的标题2",-1);... 这⾥我就没有编写⼦iter⽤法的列⼦了。关⼼的同学可以⾃⼰去查阅GTK+API⼿册,经过上⾯的讲解应该不难了3.2 创建⼀个视图当我们创建完成我们的模式(数据库)创建之后,我们就可以创建⼀个视图来显⽰它了。这就要⽤到我们的GtkTreeView视图了。GtkWidget*    tree;tree = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));然后我们定义这个视图的列,我们需要⽤到⼀个 GtkTreeViewColumn 的对象了
GtkCellRenderer *renderer;/* 渲染器 */GtkTreeViewColumn *column;renderer =
gtk_cell_renderer_text_new();g_object_set(G_OBJECT(renderer), "foreground", "red", NULL);column =
电子体温表gtk_tree_view_column_new_with_attributes("编号",
无锡 性息renderer,                                                    "text", AUTHOR_COLUMN,
NULL);gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column);
智投分析
上⾯的⼏条语句就定义了⼀个列对象了,并且把这个列对象与模式的第MYID_COLUMN列联系起来了,然后我们将这个列添加到我们的tree视图中。按照同样的⽅式我们就可以添加其他更多的列了。到了这⼀步我们也算了解了GtkTreeView的创建的过程了,最后我们再为每个⾏添加⼀个⾏选择信号处理函数就⽐较完美了。3.3 添加⾏选择信号⼤多数的应⽤程序不仅仅只需要处理显⽰数据就完成了,⽽且还需要获取⽤户的输⼊信号,为了达到这个⽬的,我们使⽤"changed"信号来与⽤户的选择信号进⾏关联起来。
新贸易保护主义/* changed信号处理函数原型 */static void tree_selection_changed(GtkTreeSelection *selection, gpointer data);/*设置选择对象*/GtkTreeSelection *select;select =
gtk_tree_view_get_selection(GTK_TREE_VIEW(tree));gtk_tree_selection_set_mode(select,
GTK_SELECTION_SINGLE);g_signal_connect(G_OBJECT(select),
"changed",G_CALLBACK(tree_selection_changed),NULL);三、总结为了给上⾯的讲解有⼀个更加直观的了解,我为其写了⼀个简单的⽤例,在这个⽤例中,我设计了4列其他们之间完全没有任何的联系,只是为了给⼤家演⽰某种对象或控件的⽤法,例如我把"编号"列的字体设为了红⾊,是为了让⼤家了解“渲染器”的⽤法,给程序添加⼀个进度条,是为了给⼤家演⽰在GtkTreeView中进度条,该怎么使⽤,只要在加上⼀个计时器,进度条就可以动起来了。希望这篇⽂章对各位学习GtkTreeView的
同学有所帮助,由于代码有点长度,因此没有列在⽂章中,但是在⽂章的开头我已经提供了下载源代码的连接。其中包含⼀个GtkTreeView.c的⽂件,和Makefile⽂件,以及⼀个已经编译过的可直接运⾏的GtkTreeView程序,如果点击不能运⾏,请修改该程序的属性以允许该程序执⾏。代码预览:
注意:如果你要亲⾃编译,请确保你已经安装了Gtk库⽂件,安装⽅法sudo apt-get install libgtk+-2.0。如果安装不了,请换⼀个更新源。有什么问题可以给我留⾔,如果你⽆法下载源代码,请留下你的邮箱,我将直接发送到你的邮箱⾥⾯去。

本文发布于:2024-09-23 12:29:52,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/38693.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:模式   数据   创建   程序   视图
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议