1. 程式人生 > >GTK+圖形化應用程式開發學習筆記(二十)—分欄列表構建

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

}

程式執行後當用戶點選單元格,螢幕就列印相應的內容。