linux应用程序开发指南之21-12.pdf
《linux应用程序开发指南之21-12.pdf》由会员分享,可在线阅读,更多相关《linux应用程序开发指南之21-12.pdf(11页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、下载第12章 树 构 件树构件一般用于显示分层结构的数据。树构件本身是 G t k Tr e e I t e m构件类型的垂直容器。树构件本身和分栏列表构件(G t k C L i s t)差别并不大:它们都是由容器构件派生而来的,其中与容器相关的函数在树构件和分栏列表构件中同样起作用。差别在于树构件可以嵌套另外的树构件。下面简要介绍怎么使用树构件。树构件有自己的X窗口,缺省情况下是白色的背景。还有,绝大多数树的函数与分栏列表的函数工作方法是一样的。然而,树构件并不是从分栏列表构件派生而来的,因此,这些函数不可以互换。12.1 创建新树构件用下面函数创建树构件:GtkWidget*gtk_tr
2、ee_new(void);像分栏列表构件一样,当项目添加到树构件时,或当子树扩展时,树构件会自动扩展。因为这个原因,所以需要将树构件组装到一个滚动窗口构件中。滚动窗口构件的缺省尺寸是很小的,因此一般对滚动窗口要用 g t k _ w i d g e t _ s e t _ u s i z e()函数设置它的缺省尺寸,以保证树构件足够大,可以看到其中的项目。有了树构件后,就可以向其中添加项目了。现在,我们先介绍怎样创建树项构件:GtkWidget*gtk_tree_item_new_with_label(gchar*label);现在可以用下面的函数将树项构件添加到树构件中了:void gtk_
3、tree_append(GtkTree *tree,GtkWidget*tree_item);void gtk_tree_prepend(GtkTree *tree,GtkWidget*tree_item);注意,必须一次将全部树项添加到树构件中。没有与 g t k _ l i s t _*_ i t e m s()等价的函数。12.1.1 添加一个子树子树与树构件的创建方法类似。子树要加到一个树构件的树项下面,使用以下函数:void gtk_tree_item_set_subtree(GtkTreeItem*tree_item,GtkWidget *subtree);在子树添加到一个树项之前
4、或之后都不需要对子树调用g t k _ w i d g e t _ s h o w()函数。然而,在调用 g t k _ t r e e _ i t e m _ s e t _ s u b t r e e()之前,必须将树项添加到一棵父树上。这是因为:从技术上来说,子树的父树并不是拥有它的树项构件(G t k Tr e e I t e m),而是树项所在的树。当将子树添加到树项时,一个“”或“”符号会出现在旁边,用户可以点击它“展开”或“折叠”子树也就是显示或隐藏子树。缺省状态树项是折叠起来的。注意,在折叠树项时,所有子树的选中状态仍然保持原有状态,这可能是用户不希望看到的。第1 2章树构件使
5、用205下载12.1.2 处理选中的列表与分栏列表构件 G t k C L i s t一样,树构件类型也有一个选择域。可以用下面的函数设置选择模式以控制树构件的行为:void gtk_tree_set_selection_mode(GtkTree *tree,GtkSelectionMode mode);与各种选择模式相关的语义在分栏列表构件 G t k C L i s t中有详细的介绍。与G t k C L i s t构件一样,当选择列表项或取消选择时,会引发 s e l e c t _ c h i l d、u n s e l e c t _ c h i l d、和s e l e c t i
6、 o n _ c h a n g e d信号。然而,要使用这些信号,需要知道树构件怎样引发信号,以及如何查找选中的列表项。所有的树构件都有自己的X窗口,它们能够接受事件,例如鼠标点击。然而,要让树构件的选择类型为G T K _ S E L E C T I O N _ S I N G L E和G T K _ S E L E C T I O N _ B R O W S E的树能够正常动作,选中项的列表必须是针对树构件层次上最顶层的(也就是所谓的“根”树)。因而,除非你已经知道它是“根”树,否则,直接访问任意一个树构件的选择状态并不是什么好主意。应该使用 GTK_TREE_SELECTION(Tr
7、e e)宏,它将给出一个指向“根”树的选择列表的指针。当然,如果选择模式是 G T K _ S E L E C T I O N _ M U LT I P L E(可以多选),这个选择列表也包含了其他不在所涉及到的子树下的树项。最后,整个树都能引发s e l e c t _ c h i l d(理论上还有u n s e l e c t _ c h i l d)信号,但是,只有根树才能引发s e l e c t i o n _ c h a n g e d信号。因而,如果想对一棵树和它的子树的 s e l e c t _ c h i l d信号进行响应,必须对每一个子树调用g t k _ s i g
8、 n a l _ c o n n e c t()函数。12.1.3 树构件内部机制Tr e e的结构定义是这个样子:struct _GtkTreeGtkContainer container;GList*children;GtkTree*root_tree;/*owner of selection list*/GtkWidget*tree_owner;GList*selection;guint level;guint indent_value;guint current_indent;guint selection_mode:2;guint view_mode:1;guint view_lin
9、e:1;前面已经介绍过了直接访问树的选择状态的危险性。树构件定义中的其他部分也可以用宏或者函数访问。GTK_IS_ROOT_TREE(Tr e e)返回一个布尔值,指明一个树是否是“根”树,而GTK_TREE_ROOT_TREE(Tr e e)宏返回指定树的“根”树(G t k Tr e e类型的值)(所以,要记住如果想使用g t k _ w i d g e t _*()类型的函数,要用GTK_WIDGET(Tr e e)宏将对象转换为构件类型)。与其直接访问Tr e e构件的子节点域,不如用 G T K _ C O N TAINER(Tr e e)宏将树转换为一个206使第二部分 Linux
10、编程常用C语言函数库及构件库下载指针,然后将它传递到 g t k _ c o n t a i n e r _ c h i l d r e n()函数中。这样将为原来的列表创建一个副本。使用完后要用g _ f r e e()函数释放它,或用破坏性的方法遍历它。如下所示:children=gtk_container_children(GTK_CONTAINER(tree);while(children)do_something_nice(GTK_TREE_ITEM(children-data);children=g_list_remove_link(children,children);上面的t
11、r e e _ o w n e r域只在子树中有定义,它指向容纳这个子树的树项构件;l e v e l域指出特定树的嵌套层次,根部树的 l e v e l是0,每一个子树比它的双亲树的 l e v e l大1。这个域只有在树已在屏幕上绘出后才有设置值。12.1.4 信号void selection_changed(GtkTree*tree);当树构件的选择区域发生变化时,会引发这个信号。也就是当选中树构件的子树或取消选择时。void select_child(GtkTree *tree,GtkWidget*child);当选中树构件的子树时,将引发这个信号。当调用g t k _ t r e e
12、 _ s e l e c t _ i t e m()和g t k _ t r e e _ s e l e c t _ c h i l d()、或当鼠标按钮按下,调用g t k _ t r e e _ i t e m _ t o g g l e()和g t k _ i t e m _ t o g g l e()函数时,也会引发该信号。当子树被添加到树上或者将子树从树上删除时会间接引发这个信号。void unselect_child(GtkTree *tree,GtkWidget*child);当树的子树要被取消选中时,引发这个信号。12.1.5 函数和宏guint gtk_tree_get_ty
13、pe(void);返回G t k Tr e e构件的类型标识符GtkWidget*gtk_tree_new(void);创建新树,并返回指向G t k Wi d g e t对象类型的指针。如果创建失败,返回 N U L L。void gtk_tree_append(GtkTree *tree,GtkWidget*tree_item);将一个树项添加到树构件的后面。void gtk_tree_prepend(GtkTree *tree,GtkWidget*tree_item);将一个树项添加到树构件的前面。void gtk_tree_insert(GtkTree *tree,GtkWidget*
14、tree_item,gint position);在树构件中的指定位置插入树项。void gtk_tree_remove_items(GtkTree*tree,GList *items);将一个树项列表(GList*形式的列表)从树构件中删除。注意,从一个树上删除一个树项会第1 2章树构件使用207下载解除它和它的子树,以及该子树的子树(如果有的话)的引用。如果只想删除一个树项,可以使用g t k _ c o n t a i n e r _ r e m o v e()函数。void gtk_tree_clear_items(GtkTree*tree,gint start,gint end);删
15、除树构件中从s t a r t位置到e n d位置的树项。和上一个函数一样,它会解除树项及其子树的引用,因为这个函数只是构造一个列表,然后将列表传递给 g t k _ t r e e _ r e m o v e _ i t e m s()函数。void gtk_tree_select_item(GtkTree*tree,gint item);对指定i t e m位置的树项引发“s e l e c t _ i t e m”信号,并选中它(除非在信号处理函数中取消选择)。void gtk_tree_unselect_item(GtkTree*tree,gint item);对指定i t e m位置
16、的树项引发“u n s e l e c t _ i t e m”信号,并取消选择。void gtk_tree_select_child(GtkTree *tree,GtkWidget*tree_item);对子树项引发“s e l e c t _ i t e m”信号,并且选中它。void gtk_tree_unselect_child(GtkTree *tree,GtkWidget*tree_item);让子树项引发“u n s e l e c t _ i t e m”信号,并取消选中状态。gint gtk_tree_child_position(GtkTree *tree,GtkWidge
17、t*child);返回一个子构件在树中的位置。如果子构件不在树中,将返回-1。void gtk_tree_set_selection_mode(GtkTree *tree,GtkSelectionMode mode);设置选择模式。模式可以是 GTK_SELECTION_SINGLE(缺省值),或G T K _ S E L E C T I O N_ B R O W S E、G T K _ S E L E C T I O N _ M U LT I P L E或G T K _ S E L E C T I O N _ E X T E N D E D。它只对根部树有定义,也只有对根部树有意义,因为只有
18、根部树才会被选择。它对子树设置没有任何效果,并简单忽略设置值。void gtk_tree_set_view_mode(GtkTree *tree,GtkTreeViewMode mode);设置“视图模式”可以是GTK_TREE_VIEW_LINE(缺省值)或GTK_TREE_VIEW_ITEM。视图模式从一个树构件传递到它的子树,并且不能对某个子树单独设置(这种说法也不完全正确)。用术语解释“视图模式”相当暧昧,而在图中它决定当一个树的孩子被选中时,突出显示是什么样子。如果是G T K _ T R E E _ V I E W _ L I N E,整个树项会突出显示,如果是G T K _ T
19、R E E _ V I E W _ I T E M,只有子构件(通常是标签)突出显示。void gtk_tree_set_view_lines(GtkTree*tree,guint flag);是否在树项间划线。F l a g参数可以是T R U E代表在树项间划线,或者FA L S E,在树项间不划线。GtkTree*GTK_TREE(gpointer obj);208使第二部分 Linux编程常用C语言函数库及构件库下载将一个普通对象指针转换为G t k Tree*指针。GtkTreeClass*GTK_TREE_CLASS(gpointer class);将一个普通类指针转换为G t k
20、 TreeClass*指针。gint GTK_IS_TREE(gpointer obj);判定一个普通指针是否指向一个G t k Tr e e对象。gint GTK_IS_ROOT_TREE(gpointer obj)判定一个普通指针是否指向 G t k Tr e e构件以及它是否根树。虽然它可以接收任何指针,向函数传递一个并不指向树构件的指针也可能会引发问题。GtkTree*GTK_TREE_ROOT_TREE(gpointer obj)返回一个指向G t k Tr e e构件的指针的根节点树。上面的警告同样适用。GList*GTK_TREE_SELECTION(gpointer obj)返
21、回一个G t k Tr e e构件的根树的选择列表。上面的警告同样适用。12.2 树项构件GtkTreeItem树项构件和分栏列表项构件一样,是从 G t k I t e m构件派生而来的,而 G t k I t e m是从G t k B i n构件派生而来的,因此,G t k Tr e e I t e m是一种普通的容器,它只能包含一个子构件,且子构件可以是任何类型的。树项构件有一些额外的域,我们唯一需要关心的是s u b t r e e子树域。Tr e e I t e m结构的定义是下面这样的:struct _GtkTreeItemGtkItem item;GtkWidget*subtre
22、e;GtkWidget*pixmaps_box;GtkWidget*plus_pix_widget,*minus_pix_widget;GList*pixmaps;guint expanded:1;p i x m a p s _ b o x域是一个事件盒构件,它捕捉对“”或“”的点击,控制树的展开或折叠。p i x m a p域指向一个内部的数据结构。因为它总是可以使用 G T K _ T R E E _ I T E M _ S U B T R E E(I t e m)以一种相对安全的方式获得树项构件的 s u b t r e e域,因而最好不要对树项构件的内部进行操作,除非你确实知道你在做什
23、么。因为它是直接从G t k I t e m构件派生而来的,所以它可以用GTK_ITEM(TreeItem)宏转换为一个指针。树项通常带一个标签,因此可以用g t k _ l i s t _ i t e m _ n e w _ w i t h _ l a b e l()方便地创建新的树项。同样的效果可以用下面的代码获得。这些代码实际上是逐字从 gtk_tree_item_new_with _label()函数中复制而来:tree_item=gtk_tree_item_new();label_widget=gtk_label_new(label);gtk_misc_set_alignment(G
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- linux 应用程序 开发 指南 21 12
限制150内