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可以設定單元格的文字,函式可以用新文字來覆蓋原有的文字,row和column用來指定單元的位置,單元格的橫縱位置都是從0開始的。
gtk_clist_get_text取得指定單元格的資料,這些指標都是指向儲存在構件內部的資料指標,所以不應該修改或釋放。引用的資料沒有必要將不感興趣的資料全部讀出。任何返回值指標(除了GtkCList構件)都可以是NULL。
四、訊號
與其他構件一樣,GtkCList有一些訊號供我們使用。GtkCList構件是從容器構件GtkContainer派生的,它有容器所具有的一些訊號,還有下面這些附加訊號:
select_row:選中一行時引發,該訊號傳遞以下資訊,依次是GtkCList *clist、gint row、
gint column、GtkEventButton *event、gpointer data。該訊號的回撥函式形勢如下:
void select_row_callback(GtkWidget *widget,gint row,gint column,GtkEventButton *event,gpointer data);
unselect_row:使用者對一行取消選擇,引發這個訊號。傳遞的資訊與上一個訊號一樣。
click_column:選中某一列時引發。傳遞以下資訊: GtkCList *clist、gint column、gpointer 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); } |
程式執行後當用戶點選單元格,螢幕就列印相應的內容。