七、GTK 如何使用Treeview(二)

 
   继续写,这篇才是真正的Treeview,于Listview大同小异,呵呵!

    与上一篇的Listview一样,Treeview也需要一个Model:
    1.创建一个Treeview
    GtkWidget *tree = gtk_tree_view_new();
    添加表头,如下代码
    enum {col_name = 0, n_cols};   // 定义枚举类型,不明白的话参考C语言
    // 这里的枚举之定义了一列,当然你可以自己多定义几列
    // 其中col_name为列,n_clos为列数,这里自动为1
   GtkCellRenderer* renderer;   // 定义一个Render
   renderer = gtk_cell_renderer_text_new();  // 创建一个Render
    /* 把这一列加到Listview中 */
  gtk_tree_view_insert_column_with_attributes(
        GTK_TREE_VIEW(list),    //
        -1,
        "name",                 // 显示的内容
        renderer,               // 上面创建的Render
        "text",                 // 显示的格式
        col_name,               // 列号
        NULL);
    这就完成了一列的添加,其实对于Treeview来说一般只有一列,上面的代码可以通用,只要改一下表头就行了。
    添加节点,与前一篇的listview一样;
    首先,我们需要创建一个GtkTreeModel来存储其数据。
    下面是我们自己写的一个函数:
/*  创建model */
GtkTreeModel *createModel()
{
    GtkTreeStore *store;
    /* 创建model,注意这个函数的参数,第一个为列数,后面一次是列存储数据的类型,我们这里是一列,如果是多列在后面依次增加就行,如:
    gtk_tree_store_new(n_cols, G_TYPE_STRING, G_TYPE_STRING);
     */
    store = gtk_tree_store_new(n_cols, G_TYPE_STRING);  // 注意这里是gtk_tree_store_new不是gtk_list_store_new
    return GTK_TREE_MODEL(store);
}
调用函数:
    GtkTreeModel *store = createModel();
然后调用gtk_tree_view_set_model函数来绑定model和tree,这是必须的,如下所示:
    gtk_tree_view_set_model(GTK_TREE_VIEW(tree), store);
    下面的工作就是往model中添加数据了,
    GtkTreeIter iter;  // 定义元素,GtkTreeIter是一个结构,我理解它是一个节点
    gtk_tree_store_append(GTK_TREE_STORE(store), &iter, NULL);
    // 把这节点添加到model中,treeview也就会显示出来了
    // 注意:与listview不同的是,它多出一个参数,多出来的这个参数就是这个节点的父节点,当它为NULL是,节点就被添加到Root之下,
    /* 为节点添加数据 */
    gtk_tree_store_set(GTK_TREE_STORE(store),
                       &iter,
                       col_name,    //  行号
                       "Tom",       //  内容  
                       -1);

    好了,节点已经显示在树中了,最后记得调用g_object_unref(store)。
    改进:把添加节点的这多代码写道函数中会很舒服吧?
GtkTreeIter addChild(GtkTreeModel *store, const char *text, GtkTreeIter *parent)
{
    GtkTreeIter iter;
    if (! parent)
        gtk_tree_store_append(GTK_TREE_STORE(store), &iter, NULL);
    else
        gtk_tree_store_append(GTK_TREE_STORE(store), &iter, parent);
    gtk_tree_store_set(GTK_TREE_STORE(store), &iter,
                             col_name, text,
                               -1); 

    return iter;
}

加图标?以后再说吧!:)
posted on 2008-08-11 09:00  dotjava  阅读(1079)  评论(0编辑  收藏  举报