鱼C论坛

 找回密码
 立即注册
查看: 2241|回复: 1

[技术交流] C语言GUI程序设计-GTK图文系列-树状视图

[复制链接]
发表于 2014-12-6 11:15:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
gtk_treeview_treeview.png

这一讲讲解GtkTreeView的树状视图显示。

  1. #include <gtk/gtk.h>

  2. enum
  3. {
  4.   LIST_ITEM = 0,
  5.   N_COLUMNS
  6. };

  7. void init_list(GtkWidget *list)
  8. {
  9.     GtkCellRenderer *renderer;
  10.     GtkTreeViewColumn *column;

  11.     renderer = gtk_cell_renderer_text_new();
  12.     column = gtk_tree_view_column_new_with_attributes("TreeView in TreeView Mode",renderer, "text", LIST_ITEM, NULL);
  13.     gtk_tree_view_append_column(GTK_TREE_VIEW(list), column);
  14. }

  15. void init_data(GtkWidget *list)
  16. {
  17.     GtkTreeStore *store;
  18.     GtkTreeIter toplevel, child;

  19.     store = gtk_tree_store_new(N_COLUMNS,G_TYPE_STRING);

  20.     gtk_tree_store_append(store, &toplevel, NULL);
  21.     gtk_tree_store_set(store, &toplevel,LIST_ITEM, "users",-1);

  22.     gtk_tree_store_append(store, &child, &toplevel);
  23.     gtk_tree_store_set(store, &child,LIST_ITEM, "fishc",-1);
  24.     gtk_tree_store_append(store, &child, &toplevel);
  25.     gtk_tree_store_set(store, &child,LIST_ITEM, "g0398",-1);

  26.     gtk_tree_view_set_model(GTK_TREE_VIEW(list),GTK_TREE_MODEL(store));
  27. }
  28. void selection_changed(GtkTreeSelection *selection, gpointer user_data)
  29. {
  30.     GtkTreeIter iter;
  31.     GtkTreeModel *model;
  32.     char *value;
  33.     if (gtk_tree_selection_get_selected(GTK_TREE_SELECTION(selection), &model, &iter))
  34.     {
  35.         gtk_tree_model_get(model, &iter, LIST_ITEM, &value,  -1);
  36.         g_print("select item is: %s\n", value);
  37.         g_free(value);
  38.     }
  39. }
  40. int main(int argc,char *argv[ ])
  41. {
  42.     GtkWidget *window,*list;
  43.     GtkTreeSelection *selection;

  44.     gtk_init(&argc,&argv);
  45.     window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
  46.     gtk_window_set_title(GTK_WINDOW(window),"hello fishc - TreeView");
  47.     gtk_widget_set_size_request(GTK_WIDGET(window),300,200);

  48.     list = gtk_tree_view_new();
  49.     gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(list), TRUE);

  50.     selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(list));
  51.     g_signal_connect(selection, "changed", G_CALLBACK(selection_changed), NULL);

  52.     init_list(list);
  53.     init_data(list);

  54.     gtk_container_add(GTK_CONTAINER(window), list);

  55.     gtk_widget_show_all(window);
  56.     gtk_main();
  57.     return 0;
  58. }
复制代码

和上节的代码一样,只是Model变了而已,MVC模式的特性体现出来了。主要看 init_data函数,这个函数用来设置View关联的Model。
这里使用GtkTreeStore作为视图的模型,主要用到两个函数。

gtk_tree_store_append
这个函数用来为GtkTreeStore对象添加数据迭代器。具有三个参数。
第一个参数:为GtkTreeStore对象
第二个参数:数据迭代器
第三个参数:数据迭代器的父级(树状结构),如果没有则为NULL,表示顶级节点

gtk_tree_store_set
这个函数用来设置迭代器的数据,和上一节的gtk_list_store_set函数一样,这里就不再赘述。

到这里GTK中常用部件就说的差不多了,但是我们都是用代码来生成GUI的,在开发时完全没有可视化效果,全凭想象能力了,这样不好,容易出错,比如要设置一个Button的位置就需要改一次坐标运行一次看效果,太过繁琐,不过别担心,GTK也有所见即所得的界面设计器,下一节来讲解GTK中的界面设计器——Glade
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-12-6 11:40:50 | 显示全部楼层
支持楼主。。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-18 10:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表