GTK+图形化应用程序开发学习笔记(二十)—分栏列表构建

来源:互联网 发布:来须苍真 知乎 编辑:程序博客网 时间:2024/06/05 18:46

                                          GTK+图形化应用程序开发学习笔记(二十)—分栏列表构建

分栏列表构件(GtkCList)是较常用的构件,它是多列列表构件,可以非常方便的处理数千列的信息。每一列都可以有一个标题,而且可以是活动的。你还可以将函数绑定到列选择上。

 

一、创建分栏列表构件

       创建GtkCList构件的方法和创建其他构件的方法是类似的。

 

1

名称:

gtk_clist_new

功能:

创建分栏列表构件

头文件:

#include <gtk/gtk.h>

函数原形:

GtkWidget *gtk_clist_new(gint columus);

参数:

columus   分栏列表的列数

返回值:

新的分栏列表构件

      

 

 

 

 

 

 

 

 

 columus就是分栏列表的列数。注意分栏列表没有自己的滚动条,如果要提供滚动条功能,应该将分栏列表构件放在一个滚动窗口构件中。

       现在创建完的分栏列表构件,外观和文本框一样,我们需要设置分栏列表构件的列标题。

 

2

名称:

gtk_clist_set_column_title

功能:

设置分栏列表构件的列标题

头文件:

#include <gtk/gtk.h>

函数原形:

gtk_clist_set_column_title(GtkCList *clist,gint column,gchar *title);

参数:

clist        分栏列表构件

column     标题的编号

title        列标题

返回值:

      

      

 

 

 

 

 

 

 

 

 

clist是就要设置的分栏列表构件,column就标题的编号,也是标题在分栏按钮中的位置0为第一个位置。

       在设置完分栏列表构件的列标题后还要调用gtk_clist_column_titles_show函数把他显示出来。

 

3

名称:

gtk_clist_column_titles_show

功能:

显示分栏列表构件的列标题

头文件:

#include <gtk/gtk.h>

函数原形:

gtk_clist_column_titles_show(GtkCList *clist);

参数:

clist        分栏列表构件

返回值:

      

 

 

 

 

 

 

 

 

好了下面我们就可以建立没有内容的分栏列表构件了。

#include <gtk/gtk.h>

 

int main(int argc,char *argv[ ])

{

GtkWidget *window;

GtkWidget *clist;

 

gtk_init(&argc,&argv);

window=gtk_window_new(GTK_WINDOW_TOPLEVEL);

gtk_signal_connect(GTK_OBJECT(window),”delete_event”,GTK_SIGNAL_FUNC(gtk_main_quit),NULL);

gtk_widget_set_size_request(window,200,150);

gtk_container_set_border_width(GTK_CONTAINER(window),10);

 

clist=gtk_clist_new(3);

gtk_clist_set_column_title(GTK_CLIST(clist),0,”姓名”);

gtk_clist_set_column_title(GTK_CLIST(clist),1,”姓别”);

gtk_clist_set_column_title(GTK_CLIST(clist),2,”年龄”);

 

gtk_clist_column_titles_show(GTK_CLIST(clist));

gtk_container_add(GTK_CONTAINER(window),clist);

 

gtk_widget_show(clist);

gtk_widget_show(window);

gtk_main();

}

       程序运行后得到如下界面:

 

 

还有一些函数可以对分栏列表的列标题进行操作,下面我们分别进行介绍。

 

4

名称:

gtk_clist_column_titles_hide

功能:

隐藏分栏列表构件的列标题

头文件:

#include <gtk/gtk.h>

函数原形:

gtk_clist_column_titles_show(GtkCList *clist);

参数:

clist        分栏列表构件

返回值:

      

 

 

 

 

 

 

 

 

创建分栏列表构件时自动创建响应的标题按钮。标题一般处于分栏窗口的顶部,它可以是能对鼠标点击的按钮,也可以仅仅是不会作任何响应的标签。下面的四个函数可以设置这些标签的状态。

 

5

名称:

gtk_clist_column_title_active

gtk_clist_column_title_passive

gtk_clist_column_titles_active

gtk_clist_column_titles_passive

功能:

激活/停用分栏列表构件的列标题按钮

头文件:

#include <gtk/gtk.h>

函数原形:

gtk_clist_column_titles_active(GtkCList *clist,gint column);

参数:

clist        分栏列表构件

column      列标题编号

返回值:

      

 

 

 

 

 

 

 

 

 

 

 

 

活动标题就是可以对用户动作响应的按钮标题,被动标题仅仅是一个标签。前两个函数激活或停用指定列的标题按钮,后两个激或或禁用整个分栏列表构件的按钮标题。

有时候不是所有的标题都是文本。GtkCList构件为我们提供的标题按钮实际上能够和所有的构件结合起来使用,例如,它可以和pixmap构件结合起来,在上面显示一副图片。使用下面得用函数可以为标题按钮设置构件。

6

名称:

gtk_clist_set_column_widget

功能:

为标题按钮设置构件

头文件:

#include <gtk/gtk.h>

函数原形:

gtk_clist_set_column_twidget(GtkCList *clist,gint column,GtkWidget *widget);

参数:

clist        分栏列表构件

column      列标题编号

widget       要设置的构件

返回值:

 

      

 

 

 

 

 

 

 

 

 下面我们来看看上面几个函数的作用:

#include <gtk/gtk.h>

 

int main(int argc,char *argv[ ])

{

GtkWidget *window;

GtkWidget *clist;

GtkWidget *image;

 

gtk_init(&argc,&argv);

window=gtk_window_new(GTK_WINDOW_TOPLEVEL);

gtk_signal_connect(GTK_OBJECT(window),”delete_event”,GTK_SIGNAL_FUNC(gtk_main_quit),NULL);

gtk_widget_set_size_request(window,200,150);

gtk_container_set_border_width(GTK_CONTAINER(window),10);

 

clist=gtk_clist_new(3);

gtk_clist_set_column_title(GTK_CLIST(clist),0,”姓名”);

gtk_clist_set_column_title(GTK_CLIST(clist),1,”姓别”);

gtk_clist_set_column_title(GTK_CLIST(clist),2,”年龄”);

 

gtk_clist_column_title_passive(GTK_CLIST(clist),1);/*设置编号为1的列标题为不活动的列标题*/

image=gtk_image_new_from_file(“1”); /*创建图片构件,大家可以把参数改为自己的图片文件名*/

gtk_clist_set_column_widget(GTK_CLIST(clist),0,image);/*设置标题按钮构件*/

 

gtk_clist_column_titles_show(GTK_CLIST(clist));

gtk_container_add(GTK_CONTAINER(window),clist);

 

gtk_widget_show(clist);

gtk_widget_show(window);

gtk_main();

}

 

       运行上面程序得到如下界面:

 

我们还可以用gtk_clist_set_shadow_type来设置分栏列表构件的边框类型。

 

7

名称:

gtk_clist_set_shadow_type

功能:

设置分栏列表构件的边框类型

头文件:

#include <gtk/gtk.h>

函数原形:

gtk_clist_set_shadow_type(GtkCList *clist,GtkShadowType border);

参数:

clist        分栏列表构件

border      边框类型

返回值:

     

 

 

 

 

 

 

 

 边框类型可以取下面的值:

       GTK_SHADOW_NONE

       GTK_SHADOW_IN

       GTK_SHADOW_OUT

       GTK_SHADOW_ETCHED_IN

       GTK_SHADOW_ETCHED_OUT

 

二、向列表中添加/删除行

       可以用三种方法添加行。即在前面、后面和指定位子加入行。

 

8

名称:

gtk_clist_prepend

gtk_clist_append

gtk_clist_insert

功能:

向列表中添加行

头文件:

#include <gtk/gtk.h>

函数原形:

gtk_clist_prepend(GtkCList *clist, gchar *text[ ]);

gtk_clist_append(GtkCList *clist, gchar *text[ ]);

gtk_clist_insert(GtkCList *clist, gint row, gchar text[ ]);

参数:

clist        分栏列表构件

row        列标题编号

text        文本数组

返回值:

 

 

      

 

 

 

 

 

 

 

 

 

 

有两种方式在列表中删除行,gtk_clist_remove可以删除指定的行,gtk_clist_clear可以删除所有的行。

 

9

名称:

gtk_clist_remove

gtk_clist_clear

功能:

向列表中添加/删除行

头文件:

#include <gtk/gtk.h>

函数原形:

gtk_clist_remove(GtkCList *clist, gint row);

gtk_clist_clear(GtkCList *clist);

参数:

clist        分栏列表件

row        行编号

返回值:

 

      

 

 

 

 

 

 

 

 

还有两个很方便的函数可以用在当列表中要发生很大变化时。因为GtkCList在发生变化时要重绘自身,所以当列表中内容变化较大时,频繁重绘会让屏幕不停闪烁。最好的办法是先将列表“冻结”,然后更新列表,最后将其“解冻”。

10

名称:

gtk_clist_freeze

gtk_clist_thaw

功能:

冻结/解冻列表

头文件:

#include <gtk/gtk.h>

函数原形:

gtk_clist_freeze(GtkCList *clist);

gtk_clist_thaw(GtkCList *clist);

参数:

clist        分栏列表构件

返回值:

      

 

 

 

 

   

 

 

 

 

    下面我们就向列表中插入几行数据:

#include <gtk/gtk.h>

 

int main(int argc,char *argv[ ])

{

GtkWidget *window;

GtkWidget *clist;

gchar *text1[3]={“刘备”,””,”23”}; /*定义列表项数据*/

gchar *text2[3]={“关羽”,””,”22”};

 

gtk_init(&argc,&argv);

window=gtk_window_new(GTK_WINDOW_TOPLEVEL);

gtk_signal_connect(GTK_OBJECT(window),”delete_event”,GTK_SIGNAL_FUNC(gtk_main_quit),NULL);

gtk_widget_set_size_request(window,200,150);

gtk_container_set_border_width(GTK_CONTAINER(window),10);

 

clist=gtk_clist_new(3);

gtk_clist_set_column_title(GTK_CLIST(clist),0,”姓名”);

gtk_clist_set_column_title(GTK_CLIST(clist),1,”姓别”);

gtk_clist_set_column_title(GTK_CLIST(clist),2,”年龄”);

 

gtk_clist_prepend(GTK_CLIST(clist),text1);/*将列表项数据添加到列表*/

gtk_clist_prepend(GTK_CLIST(clist),text2);

 

gtk_clist_column_titles_show(GTK_CLIST(clist));

gtk_container_add(GTK_CONTAINER(window),clist);

 

gtk_widget_show(clist);

gtk_widget_show(window);

gtk_main();

}

 

       程序运行后得到如下界面:

 

三、列表设置

       可以用gtk_clist_set_column_justification函数设置列的对齐方式.

 

11

名称:

gtk_clist_set_column_justification

功能:

设置列的对齐方式

头文件:

#include <gtk/gtk.h>

函数原形:

void gtk_clist_set_column_justification( GtkCList *clist, gint column,

GtkJustification justification );

参数:

clist          分栏列表构件

column        列标题编号

justification    对齐方式

返回值:

     

 

 

 

 

 

 

 

 

 

 

 

GtkJustification参数类型可取以下值:

       GTK_JUSTIFY_LEFT:列中的文本左对齐。

GTK_JUSTIFY_RIGHT:列中的文本右对齐。

GTK_JUSTIFY_CENTER:列中的文本居中对齐。

GTK_JUSTIFY_FILL:文本使用列中所有可用的空间。

 

创建构件时单元格的宽度是依据它们的标题确定的,而单元格的高度的却省值是当前字体的高度。因此在多数情况下这不一定符合要求,gtk_clist_set_column_width函数设置单元格的宽度。gtk_clist_set_column_width函数可以设置单元格的高度。

 

12

名称:

gtk_clist_set_column_width

gtk_clist_set_row_height

功能:

设置单元格的高度和宽度

头文件:

#include <gtk/gtk.h>

函数原形:

void gtk_clist_set_column_width( GtkCList *clist,gint column,gint width );

void gtk_clist_set_row_height( GtkCList *clist,gint height );

参数:

clist        分栏列表构件

column      列标题编号

width       单元格的宽度

height       单元格的高度

返回值:

      

 

 

 

 

 

 

 

 

 

 

 

 

 

 

注意,单元格宽度和高度都是以像素度量,而不是以字母度量的。缺省值是当前字体的宽度和高度。

 

 

13

名称:

gtk_clist_set_shif

功能:

设置单元格内水平和垂直方向上的缩进

头文件:

#include <gtk/gtk.h>

函数原形:

void gtk_clist_set_shift( GtkCList *clist,gint row,gint column,gint vertical,

gint horizontal);

参数:

clist        分栏列表构件

row         行编号

column      列编号

vertical       水平缩进

horizontal     垂直缩进

返回值:

      

 

 

 

 

 

 

 

 

 

 

 

 

 

 gtk_clist_set_column_with函数可以用于设置单元格内水平和垂直方向上的缩进,缩进值是以像素度量的整数值,它可以是正数也可以是负数。下面是我们应用上面两个函数的程序例子:

#include <gtk/gtk.h>

 

int main(int argc,char *argv[ ])

{

GtkWidget *window;

GtkWidget *clist;

gchar *text1[3]={“刘备”,””,”23”}; /*定义列表项数据*/

gchar *text2[3]={“关羽”,””,”22”};

 

gtk_init(&argc,&argv);

window=gtk_window_new(GTK_WINDOW_TOPLEVEL);

gtk_signal_connect(GTK_OBJECT(window),”delete_event”,GTK_SIGNAL_FUNC(gtk_main_quit),NULL);

gtk_widget_set_size_request(window,200,150);

gtk_container_set_border_width(GTK_CONTAINER(window),10);

 

clist=gtk_clist_new(3);

gtk_clist_set_column_title(GTK_CLIST(clist),0,”姓名”);

gtk_clist_set_column_title(GTK_CLIST(clist),1,”姓别”);

gtk_clist_set_column_title(GTK_CLIST(clist),2,”年龄”);

 

gtk_clist_prepend(GTK_CLIST(clist),text1);/*将列表项数据添加到列表*/

gtk_clist_prepend(GTK_CLIST(clist),text2);

gtk_clist_set_column_justification(GTK_CLIST(clist),0,GTK_JUSTIFY_CENTER);/*设置列0的对齐方式为居中对齐*/

gtk_clist_set_column_width(GTK_CLIST(clist),0,50);/*设置列0的宽度为50*/

gtk_clist_set_shift(GTK_CLIST(clist),1,1,0,10);

 

gtk_clist_column_titles_show(GTK_CLIST(clist));

gtk_container_add(GTK_CONTAINER(window),clist);

 

gtk_widget_show(clist);

gtk_widget_show(window);

gtk_main();

}

       下面是运行后的界面:

 

       我们可以gtk_clist_get_text来得到指定单元格的数据,可以用gtk_clist_set_text来修改这些数据。

 

14

名称:

gtk_clist_get_text

gtk_clist_set_text

功能:

查看/设置单元格中的文本

头文件:

#include <gtk/gtk.h>

函数原形:

gint gtk_clist_get_text( GtkCList *clist,gint row,gint column,gchar **text );

void gtk_clist_set_text( GtkCList *clist,gint row,gint column,const gchar *text );

参数:

clist        分栏列表构件

text         单元格文本

返回值:

      

 

 

 

 

 

 

 

 

 

 

 

 

 

gtk_clist_set_text可以设置单元格的文本,函数可以用新文本来覆盖原有的文本,rowcolumn用来指定单元的位置,单元格的横纵位置都是从0开始的。

gtk_clist_get_text取得指定单元格的数据,这些指针都是指向存储在构件内部的数据指针,所以不应该修改或释放。引用的数据没有必要将不感兴趣的数据全部读出。任何返回值指针(除了GtkCList构件)都可以是NULL

 

四、信号

       与其他构件一样,GtkCList有一些信号供我们使用。GtkCList构件是从容器构件GtkContainer派生的,它有容器所具有的一些信号,还有下面这些附加信号:

select_row:选中一行时引发,该信号传递以下信息,依次是GtkCList *clistgint row

gint columnGtkEventButton *eventgpointer data。该信号的回调函数形势如下:

       void select_row_callback(GtkWidget *widget,gint row,gint column,GtkEventButton *event,gpointer data);

unselect_row:用户对一行取消选择,引发这个信号。传递的信息与上一个信号一样。

click_column:选中某一列时引发。传递以下信息: GtkCList *clistgint columngpointer data

 

下面是程序例子:

#include <gtk/gtk.h>

 

void select_row_callback(GtkWidget *clist,gint row,gint column,GdkEventButton *event,gpointer data);

 

int main(int argc,char *argv[ ])

{

GtkWidget *window;

GtkWidget *clist;

gchar *text1[3]={“刘备”,””,”23”}; /*定义列表项数据*/

gchar *text2[3]={“关羽”,””,”22”};

 

gtk_init(&argc,&argv);

window=gtk_window_new(GTK_WINDOW_TOPLEVEL);

gtk_signal_connect(GTK_OBJECT(window),”delete_event”,GTK_SIGNAL_FUNC(gtk_main_quit),NULL);

gtk_widget_set_size_request(window,200,150);

gtk_container_set_border_width(GTK_CONTAINER(window),10);

 

clist=gtk_clist_new(3);

gtk_clist_set_column_title(GTK_CLIST(clist),0,”姓名”);

gtk_clist_set_column_title(GTK_CLIST(clist),1,”姓别”);

gtk_clist_set_column_title(GTK_CLIST(clist),2,”年龄”);

 

gtk_clist_prepend(GTK_CLIST(clist),text1);/*将列表项数据添加到列表*/

gtk_clist_prepend(GTK_CLIST(clist),text2);

 

gtk_signal_connect(GTK_OBJECT(clist),”select_row”,GTK_SIGNAL_FUNC(select_row_callback),NULL);/*捕捉select_row信号*/

 

gtk_clist_column_titles_show(GTK_CLIST(clist));

gtk_container_add(GTK_CONTAINER(window),clist);

 

gtk_widget_show(clist);

gtk_widget_show(window);

gtk_main();

}

 

void select_row_callback(GtkWidget *clist,gint row,gint column,GdkEventButton *event,gpointer data)/*设置select_row信号的回调函数*/

{

gchar *text=NULL;

gtk_clist_get_text(GTK_CLIST(clist),row,column,&text);

gprint(“%s/n”,text);

}

       程序运行后当用户点击单元格,屏幕就打印相应的内容。

 


0 0