Chinaunix首页 | 论坛 | 博客
  • 博客访问: 59744
  • 博文数量: 19
  • 博客积分: 226
  • 博客等级: 二等列兵
  • 技术积分: 110
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-02 18:33
文章分类

全部博文(19)

文章存档

2011年(19)

分类: 嵌入式

2011-12-16 21:50:39

TreeView 可分为两个部分:一个是显示出来的,我们可以看见的文字、图像、复选框,下面称其为外部特征;一个是内部存储的数据。

       外部特征:一个 TreeView 有多个 Column,而每个 Column 中可以有多个 CellRenderer,同时一个 CellRenderer 自身拥有多个属性。

      TreeView 的内部数据由 TreeModel 决定,同时也由 TreeModel 存储,用 gtk_list_store_set () 设置一行的数据时,函数传递的值的类型与个数必须与 TreeModel 对应

      一般来说,当我们在程序中用 gtk_list_store_append () 添加一行,gtk_list_store_set () 设置该行的数据时,除了在 TreeModel 内部存储了数据外,还可以改变 TreeView 中该行的外部特征。

     然而,我们可以看到的 TreeView 的外部特征:文字、图像、复选框的改变,是由于 CellRenderer 的属性改变而导致的,而不是由于 TreeModel 添加了数据而导致的。
     这不是很奇怪吗?上面说 gtk_list_store_set () 可以改变 TreeView 的外部特征,现在说 TreeView 外部特征的改变不是由 gtk_list_store_set () 引起的。

     其实,gtk_list_store_set () 能改变 TreeView 一行的外部显示是因为相应的数据在函数内部实现类型转换,然后传递到 CellRenderer 的属性中,而CllRenderer 属性的改变导致了一行显示的改变。

      而 TreeModel 的哪个数据与 CellRenderer 的哪个属性联系起来是由gtk_tree_view_column_set_attributes () 决定的。这个函数把 TreeModel 的某个数据与 CellRenderer 的某个属性联系起来。当调用 gtk_list_store_set () 时,该函数在内部先把传到 TreeModel 的数据的类型转换为与 CellRenderer 属性要求的类型,然后把值赋予 CellRenderer 的属性。CellRenderer 属性的改变就导致的 TreeView 外部特征的改变了。

      下面的例子是用C实现的GtkTreeView,代码如下所示:

 

#include

enum{
 PIXBUF_COL,
 TEXT_COL
};

GtkTreeModel* createModel(){
 const gchar *files[]={"pic/caterpillar.jpg","pic/momor.jpg","pic/hamimi.jpg","pic/bush.jpg"};
 GdkPixbuf *pixbuf;
 GtkTreeIter iter;
 GtkListStore *store;
 gint i;
 
 store = gtk_list_store_new(2,GDK_TYPE_PIXBUF, G_TYPE_STRING);   //2列
 
 for(i=0;i<4;i++){
  pixbuf = gdk_pixbuf_new_from_file(files[i],NULL);
  gtk_list_store_append(store,&iter);
  gtk_list_store_set(store,&iter,
     PIXBUF_COL,pixbuf,     //PIXBUF_COL也可以用0代替
     TEXT_COL,files[i],
          -1);
  gdk_pixbuf_unref(pixbuf);
 }//for

 return GTK_TREE_MODEL(store);

}

gboolean selection_changed(GtkTreeSelection *selection, GtkLabel *label){
 GtkTreeView *treeView;
 GtkTreeModel *model;
 GtkTreeIter iter;
 gchar *active;

 treeView = gtk_tree_selection_get_tree_view(selection);
 model=gtk_tree_view_get_model(treeView);
 gtk_tree_selection_get_selected(selection,&model,&iter);
 gtk_tree_model_get(model,&iter,1,&active,-1);

 gtk_label_set_text(label,active);

}


int main(int argc, char *argv[]){
 GtkWidget *window;
 GtkWidget *treeView;
 GtkCellRenderer *renderer;
 GtkTreeViewColumn *column;
 GtkWidget *label;
 GtkWidget *vbox;
 GtkTreeSelection *selection;

 gtk_init(&argc, &argv);


 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
 gtk_window_set_title(GTK_WINDOW(window),"GtkTreeView");

 gtk_window_set_default_size(GTK_WINDOW(window),200,50);


 treeView = gtk_tree_view_new_with_model(createModel());


 renderer = gtk_cell_renderer_pixbuf_new();
 column = gtk_tree_view_column_new_with_attributes("Icon",renderer, "pixbuf", PIXBUF_COL, NULL);
 gtk_tree_view_append_column(GTK_TREE_VIEW(treeView), column);


 renderer = gtk_cell_renderer_text_new();
 column = gtk_tree_view_column_new_with_attributes("Filename",renderer, "text", TEXT_COL, NULL);
 gtk_tree_view_append_column(GTK_TREE_VIEW(treeView), column);


 label = gtk_label_new("caterpillar.jpg");
 vbox = gtk_vbox_new(FALSE,5);
 
 gtk_box_pack_start(GTK_BOX(vbox),treeView, TRUE,TRUE,5);
 gtk_box_pack_start(GTK_BOX(vbox),label, TRUE,TRUE,5);
 gtk_container_add(GTK_CONTAINER(window),vbox);

 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeView));
 g_signal_connect(G_OBJECT(selection), "changed",G_CALLBACK(selection_changed),label);

 g_signal_connect(GTK_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);

 gtk_widget_show_all(window);

 gtk_main();
 return 0;
}

 


         程序执行结果如下图

阅读(2243) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~