### 樹型和鏈表存儲類型結構的不同,今天也是看例子學會了如何使用相關函數。先看下效果吧!

~~~
/*File:tree.c
*Auth:sjin
*Date:2014-03-23
*Mail:413977243@qq.com
*/
#include <gtk/gtk.h>
enum{
ID_COLUMN,
TOGGLE_COLUMN,
TEXT_COLUMN,
N_COLUMN
};
typedef struct _listitem ListItem;
struct _listitem{
gint id;
gboolean toggle;
const gchar *text;
};
ListItem t[5] = {
{1,TRUE,"小明"},
{2,FALSE,"大寶"},
{3,TRUE,"測試用名稱"},
{4,FALSE,"顯示的文本"},
{5,TRUE,"是可編輯的"}
};
GtkListStore * create_list_model(void)
{
GtkListStore *list_store;
GtkTreeIter iter;
gint i;
/*創建一個存儲,行數和對應的數據類型列表*/
list_store = gtk_list_store_new(N_COLUMN,G_TYPE_INT,G_TYPE_BOOLEAN,G_TYPE_STRING);
for(i = 0;i < 5;i++){
/*向LIST_trore添加一個新行
* iter將指向這個新行,這個函數調用后事空的
* 需要gtk_list_store_set()函數來填寫數值
* */
gtk_list_store_append(list_store,&iter);
gtk_list_store_set(list_store,&iter,ID_COLUMN,t[i].id,
TOGGLE_COLUMN,t[i].toggle,
TEXT_COLUMN,t[i].text,
-1);
}
return list_store;
}
GtkWidget* create_list(GtkListStore* list_store)
{
GtkWidget* view;
GtkTreeModel* model;
GtkCellRenderer* renderer;
GtkTreeViewColumn* column;
model = GTK_TREE_MODEL(list_store);
/*創建一個模型初始化model的控件*/
view = gtk_tree_view_new_with_model(model);
/*創建一個文本單元繪制器*/
renderer = gtk_cell_renderer_text_new();
/*創建一個視圖列表*/
column = gtk_tree_view_column_new_with_attributes("數字",renderer,"text",ID_COLUMN,NULL);
/*附加一列列表*/
gtk_tree_view_append_column(GTK_TREE_VIEW(view),column);
/*創建一個開關單元繪制器*/
renderer = gtk_cell_renderer_toggle_new();
/*設置控件屬性*/
g_object_set(G_OBJECT(renderer),"activatable",TRUE,NULL);
/*設置開關單元繪制器為:當為TURE時為單元按鈕,為FAULE時為多選按鈕*/
gtk_cell_renderer_toggle_set_radio(GTK_CELL_RENDERER_TOGGLE(renderer),TRUE);
/**/
column = gtk_tree_view_column_new_with_attributes("按鈕",renderer,"active",TOGGLE_COLUMN,NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(view),column);
renderer = gtk_cell_renderer_text_new();
g_object_set(G_OBJECT(renderer),"editable",TRUE,NULL);
column = gtk_tree_view_column_new_with_attributes("文本",renderer,"text",TEXT_COLUMN,NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(view),column);
return view;
}
void show_list(void)
{
GtkWidget* window;
GtkWidget* frame;
GtkWidget* view;
GtkListStore* model;
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
g_signal_connect(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),window);
gtk_window_set_title(GTK_WINDOW(window),"TREEVIEW --使用 LISTSTORE");
gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
gtk_container_set_border_width(GTK_CONTAINER(window),10);
frame = gtk_frame_new("可編輯的列表");
gtk_frame_set_label_align(GTK_FRAME(frame),1.0,0);
gtk_container_add(GTK_CONTAINER(window),frame);
/*創建一個存儲列表*/
model = create_list_model();
/*創建單元格列表*/
view = create_list(model);
gtk_container_add(GTK_CONTAINER(frame),view);
gtk_widget_show_all(window);
}
enum {
XCLASS_COLUMN,
LEADER_COLUMN,
STUDENTS_COLUMN,
GIRLS_COLUMN
};
typedef struct _treeitem TreeItem;
struct _treeitem{
const char* xclass;
const char* leader;
gint students;
gint girls;
};
TreeItem ti[3] = {
{"一年級一班","李曉",40,20},
{"一年級二班","張紅",44,18},
{"一年級三班","劉麗",42,20}
};
TreeItem tj[3] = {
{"二年級一班","王可",34,16},
{"二年級二班","趙倩",34,18},
{"二年級三班","猶可",38,20}
};
GtkTreeStore* create_tree_model(void)
{
GtkTreeStore* treestore;
GtkTreeIter iter,parent;
gint i;
/*創建樹型存儲結構,每行都有一種存儲類型*/
treestore = gtk_tree_store_new(4,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_INT,G_TYPE_INT);
/*向樹型存儲結構添加新行
*iter 指向新行的空間
* */
gtk_tree_store_append(treestore,&iter,NULL);
gtk_tree_store_set(treestore,&iter,0,"一年級",-1);
gtk_tree_store_append(treestore,&iter,NULL);
gtk_tree_store_set(treestore,&iter,0,"二年級",-1);
/*gboolean gtk_tree_model_get_iter_from_string(GtkTreeModel *treestore,
* GtkTreeIter *iter,
* const gchar *path_string);
* 參數:treestore :存儲樹形列表
* iter : 指向存儲結構
* path_string : 路徑
* 返回值:TRUE : iter 不為空
* FAule: 為空
*
*/
if(gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(treestore),&parent,"0")){
for(i = 0; i < 3; i++){
gtk_tree_store_append(treestore,&iter,&parent);
gtk_tree_store_set(treestore,&iter,
XCLASS_COLUMN,ti[i].xclass,
LEADER_COLUMN,ti[i].leader,
STUDENTS_COLUMN,ti[i].students,
GIRLS_COLUMN,ti[i].girls,
-1);
}
}
if(gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(treestore),&parent,"1")){
for(i = 0; i < 3; i++)
{
gtk_tree_store_append(treestore,&iter,&parent);
gtk_tree_store_set(treestore,&iter,
XCLASS_COLUMN,tj[i].xclass,
LEADER_COLUMN,tj[i].leader,
STUDENTS_COLUMN,tj[i].students,
GIRLS_COLUMN,tj[i].girls,
-1);
}
}
return treestore;
}
GtkWidget* create_tree(GtkTreeStore* treestore)
{
GtkWidget* view;
GtkCellRenderer* renderer;
GtkTreeViewColumn* column;
/*創建樹型顯示模型*/
view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(treestore));
renderer = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes("班級名",renderer,"text",XCLASS_COLUMN,NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(view),column);
renderer = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes("班主任",renderer,"text",LEADER_COLUMN,NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(view),column);
renderer = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes("學生總數",renderer,"text",STUDENTS_COLUMN,NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(view),column);
renderer = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes("女生總數",renderer,"text",GIRLS_COLUMN,NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(view),column);
return view;
}
void show_tree(void)
{
GtkWidget* window;
GtkWidget* frame;
GtkWidget* view;
GtkTreeStore* model;
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
g_signal_connect(G_OBJECT(window),"destroy",G_CALLBACK(gtk_widget_destroy),window);
gtk_window_set_title(GTK_WINDOW(window),"TREEVIEW----使用TreeStore");
gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
gtk_container_set_border_width(GTK_CONTAINER(window),10);
frame = gtk_frame_new("樹型列表");
gtk_container_add(GTK_CONTAINER(window),frame);
model = create_tree_model();
view = create_tree(model);
gtk_container_add(GTK_CONTAINER(frame),view);
gtk_widget_show_all(window);
}
int main(int argc,char* argv[])
{
GtkWidget* window;
GtkWidget* vbox;
GtkWidget* button;
/*初始化*/
gtk_init(&argc,&argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window),"TREE_VIEW控件");
g_signal_connect(G_OBJECT(window),"delete_event",G_CALLBACK(gtk_main_quit),NULL);
vbox = gtk_vbox_new(FALSE,0);
gtk_container_add(GTK_CONTAINER(window),vbox);
button = gtk_button_new_with_label("創建列表顯示");
gtk_box_pack_start(GTK_BOX(vbox),button,FALSE,FALSE,5);
g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(show_list),NULL);
button = gtk_button_new_with_label("創建樹型顯示");
gtk_box_pack_start(GTK_BOX(vbox),button,FALSE,FALSE,5);
g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(show_tree),NULL);
gtk_widget_show_all(window);
gtk_main();
return FALSE;
}
~~~
### 關于GTK學習的例子不是特別的多。這個函數更多相關的例子請給鏈接。非常感謝!