六、GTK 如何使用Treeview(一)

 
本来打算写一下布局问题的,但是布局比较简单,自己多实验几次就差不多了。改写TreeView的学习心得了。

    在Gtk中,Treeview和Listview(暂时只发现其列表的功能,可能Listview另有其控件,这里暂时使用Listview的名字)使用 的是同一个函数gtk_tree_view_new即可;但是他跟按钮菜单等控件的区别很大,因为他还要包括节点(tree)或行(list)。下面分别 来说明一下,
    1.先从简单的入手吧ListView
    创建一个Listview非常简单
    GtkWidget *list = gtk_tree_view_new();
    对于Grid类型的Listview来说,一般都有表头,如下代码
    enum {col_name = 0, n_cols};   // 定义枚举类型,不明白的话参考C语言
    // 这里的枚举之定义了一列,当然你可以自己多定义几列
    // 其中col_name为列,n_clos为列数,这里自动为1
    // 定义enum {col_name = 0, col_age, n_cols}; 这就是定义2列,以此类推
    1    GtkCellRenderer* renderer;   // 定义一个Render
    2    renderer = gtk_cell_renderer_text_new();  // 创建一个Render
    /* 把这一列加到Listview中 */
    3    gtk_tree_view_insert_column_with_attributes(
        GTK_TREE_VIEW(list),    //
        -1,
        "name",                 // 显示的内容
        renderer,               // 上面创建的Render
        "text",                 // 显示的格式
        col_name,               // 列号
        NULL);
    这就完成了一列的添加,当然,添加多列重复2.3步即可,注意:参数变化,我想大家都能看出来吧?
    该添加数据了,这也是GtkTreeview比较难理解的地方,也比较繁琐;
    首先,我们必须了解的是一个GtkTreeview要有一个GtkTreeModel来存储其数据,并且GtkTreeview能够显示 GtkTreeModel中存储的数据,这样我们只要改变GtkTreeModel中的数据GtkTreeview显示的内容也会发生变化,这样理解起来 应该不难吧?现在我们来实践一下吧。
    对于GtkTreeview它本身并没有GtkTreeModel,所以我们要创建GtkTreeModel,下面是我们自己写的一个函数:
/*  创建model */
GtkTreeModel *createModel()
{
    GtkListStore *store;
    /* 创建model,注意这个函数的参数,第一个为列数,后面一次是列存储数据的类型,我们这里是一列,如果是多列在后面依次增加就行,如:
    gtk_list_store_new(n_cols, G_TYPE_STRING, G_TYPE_STRING);
     */
    store = gtk_list_store_new(n_cols, G_TYPE_STRING);
    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_list_store_append(GTK_TREE_STORE(store), &iter);
    // 把这一行添加到model中,listview也就会显示出来了
    /* 为这一行添加数据 */
    gtk_list_store_set(GTK_TREE_STORE(store),
                       &iter,
                       col_name,    //  行号
                       "Tom",       //  内容  
                       -1);
    如果是多列,则需要多次调用gtk_tree_store_set函数,注意参数变化!

    好了,现在数据已经显示在列表中了,最后记得调用g_object_unref(store)这个据说是在程序关闭时model中的数据占用的内存会自动释放。
posted on 2008-08-11 08:58  dotjava  阅读(1759)  评论(1编辑  收藏  举报