• treeview 学习心得(一) 简单示例(转)




    帖子wuxing 于 2008-11-21 11:41

    曾 经做过一段时间网页开发,经常用到微软的treeview控件。创建treeview控件,连接数据库,设置各种属性达到漂亮的效果,均可在清脆的鼠标单 击声轻松完成,也是我对treeview最初的印象。然而GTK的treeview控件似乎不那么简单了,即使你用glade完成界面布局,仍然有很多东 西需要自己动手去写。国内关于gtk treeview资料相当匮乏,甚至 连GTK+2.0中文教程(网络版)都跳过了treeview的介绍,目前主要学习资料还是gtk-demo里面的三个示例,但是三个示例中解释说明都是 一些废话,而且还参杂着其它一些复杂东西,让初学者阅读起来有种腾云驾雾的感觉,造成了不小的心里障碍。本人学习treeview时写过一个超级简单的代 码,虽然简单,但五脏俱全,现与大家分享,希望对初学者有所帮助,少走弯路。

    1、treeview介绍
    Treeview是根据MVC模式进行组织的,它一共可以分为三个部分。模型(Model)部分存储要显示的数据,视图(View)部分控制数据如何显示,而控制器(Controller)部分则控制那些数据用来显示,以及如何对数据进行过滤,排序等等。
    为了便于理解,我把使用treeview分成三个步骤:
    (1)创建model,用于存储数据。
    (2)设置列(column)及其属性。
    (3)绑定treeview和model,往treeview添加列。

    2、重要的接口

    gtk_list_store_new (NUM_COLUMNS, //创建model,注意这个函数的参数,第一个为列数,后面依次是列存储数据的类型
    G_TYPE_UINT,
    G_TYPE_STRING,
    G_TYPE_UINT,
    G_TYPE_UINT,
    G_TYPE_UINT);
    gtk_list_store_append (store, &iter); //把这节点添加到model中
    gtk_list_store_set (store, &iter, //为节点添加数据
    COLUMN_RANK, data[i].rank,
    COLUMN_NAME, data[i].name,
    COLUMN_GOLD, data[i].xxxx,
    COLUMN_SILVER, data[i].silver,
    COLUMN_BRONZE, data[i].bronze,
    -1);

    gtk_cell_renderer_text_new (); //创建一个文本类型的render
    gtk_tree_view_column_new_with_attributes( "1", //创建列并设置其属性
    cell_renderer,
    "text",
    COLUMN_RANK,
    NULL);
    gtk_tree_view_column_set_sort_column_id (column, COLUMN_RANK); //设置列在treeview的位置。
    gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column); //将列添加到treeview。

    gtk_tree_view_new() //创建一个treeview
    gtk_tree_view_set_model //绑定model和tree

    3、完整代码

    代码: 全选
    de>#include <gtk/gtk.h>
    #include <glib.h>

    typedef struct
    {
       guint rank;
       gchar* name;
       guint xxxx;
       guint silver;
       guint bronze;
    }Medal;

    enum
    {
       COLUMN_RANK,
       COLUMN_NAME,
       COLUMN_GOLD,
       COLUMN_SILVER,
       COLUMN_BRONZE,
       NUM_COLUMNS
    };

    static Medal data[] =
    {
       {1, "China", 51, 21, 28},
       {2, "United States", 36, 38, 36},
       {3, "Russian Fed", 23, 21, 28},
       {4, "Great Britain", 19, 13, 15},
       {5, "Germany", 16, 10, 15}
    };

    /*创建model*/
    static GtkTreeModel* create_model ()
    {
       gint i = 0;
       GtkListStore* store = NULL;
       GtkTreeIter iter = { 0 };

       /*创建list store*/
       store = gtk_list_store_new (NUM_COLUMNS,
                            G_TYPE_UINT,
                            G_TYPE_STRING,
                            G_TYPE_UINT,
                            G_TYPE_UINT,
                            G_TYPE_UINT);
       
       /*添加数据至list store*/
       for (i = 0; i < G_N_ELEMENTS (data); i++)
       {
          gtk_list_store_append (store, &iter);
          gtk_list_store_set (store, &iter,
                COLUMN_RANK, data[i].rank,
                COLUMN_NAME, data[i].name,
                COLUMN_GOLD, data[i].xxxx,
                COLUMN_SILVER, data[i].silver,
                COLUMN_BRONZE, data[i].bronze,
                -1);
       }

       return GTK_TREE_MODEL (store);
    }

    /*设置列*/
    static void set_columns (GtkTreeView* treeview)
    {
       GtkCellRenderer* cell_renderer;
       GtkTreeViewColumn* column;

            /*在treeview中添加一新列,并设置其属性*/
       cell_renderer = gtk_cell_renderer_text_new ();
       column = gtk_tree_view_column_new_with_attributes( "Rank",
             cell_renderer,
             "text",
             COLUMN_RANK,
             NULL);
       gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);

       cell_renderer = gtk_cell_renderer_text_new ();
       column = gtk_tree_view_column_new_with_attributes( "NOC Name",
             cell_renderer,
             "text",
             COLUMN_NAME,
             NULL);
       gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
             
       cell_renderer = gtk_cell_renderer_text_new ();
       column = gtk_tree_view_column_new_with_attributes( "xxxx",
             cell_renderer,
             "text",
             COLUMN_GOLD,
             NULL);
       gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);

       cell_renderer = gtk_cell_renderer_text_new ();
       column = gtk_tree_view_column_new_with_attributes( "Silver",
             cell_renderer,
             "text",
             COLUMN_SILVER,
             NULL);
       gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);

       cell_renderer = gtk_cell_renderer_text_new ();
       column = gtk_tree_view_column_new_with_attributes( "Bronze",
             cell_renderer,
             "text",
             COLUMN_BRONZE,
             NULL);
       gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);

       return;
    }

    int main (int argc, char* argv[])
    {
       GtkWidget* window;
       GtkWidget* vbox;
       GtkWidget* scrolledwindow;
       GtkWidget* treeview;

       gtk_init (&argc, &argv);

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

       vbox = gtk_vbox_new (FALSE, 0);
       gtk_widget_show (vbox);
       gtk_container_add (GTK_CONTAINER (window), vbox);

       scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
       gtk_widget_show (scrolledwindow);
       gtk_box_pack_start (GTK_BOX (vbox), scrolledwindow, TRUE, TRUE, 0);
       gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
       gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow), GTK_SHADOW_IN);

       treeview = gtk_tree_view_new ();
       gtk_widget_show (treeview);
       gtk_container_add (GTK_CONTAINER (scrolledwindow), treeview);
       
       /*设置为FALSE,headers隐藏*/   
       gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (treeview), TRUE);

       GtkTreeModel* model = create_model ();

       /*treeview连接model*/
       gtk_tree_view_set_model(GTK_TREE_VIEW (treeview), model);
       set_columns (GTK_TREE_VIEW (treeview));

       gtk_window_set_default_size (GTK_WINDOW (window), 400, 200);
       gtk_widget_show (window);
       
       gtk_main ();
       return 0;
    }
    de>


    编译命令: gcc -Wall -g treeview.c -o treeview `pkg-config --cflags gtk+-2.0` `pkg-config --libs gtk+-2.0`

    俗话说万事开头难,虽然入门有点麻烦,但是你真正掌握其原理之后,你才能发现treeview不是不可战胜。

  • 相关阅读:
    jquery事件学习笔记(转载)
    当sql报错代码,不允许对表操作的原因
    db2数据库创建一张表,并为该表加上主键递增的性能和中间表的创建的sql语句
    在Eclipse中导入dtd和xsd文件,使XML自动提示
    liunx系统环境下,爆出该错误"org.eclipse.wst.validation" has been removed解决办法
    linux 系统下配置tomcat,并给tomcat赋予最高操作权限,启动tomcat和关闭tomcat
    linux 系统下配置maven环境
    linux 系统下配置java环境变量
    hessian+spring集成应用
    Xshell添加ssh隧道SOCKS代理
  • 原文地址:https://www.cnblogs.com/zhihaowang/p/10128726.html
Copyright © 2020-2023  润新知