鱼C论坛

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

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

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

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

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

x
gtk_treeview_treeview.png

这一讲讲解GtkTreeView的树状视图显示。
#include <gtk/gtk.h>

enum
{
  LIST_ITEM = 0,
  N_COLUMNS
};

void init_list(GtkWidget *list)
{
    GtkCellRenderer *renderer;
    GtkTreeViewColumn *column;

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

void init_data(GtkWidget *list)
{
    GtkTreeStore *store;
    GtkTreeIter toplevel, child;

    store = gtk_tree_store_new(N_COLUMNS,G_TYPE_STRING);

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

    gtk_tree_store_append(store, &child, &toplevel);
    gtk_tree_store_set(store, &child,LIST_ITEM, "fishc",-1);
    gtk_tree_store_append(store, &child, &toplevel);
    gtk_tree_store_set(store, &child,LIST_ITEM, "g0398",-1);

    gtk_tree_view_set_model(GTK_TREE_VIEW(list),GTK_TREE_MODEL(store));
}
void selection_changed(GtkTreeSelection *selection, gpointer user_data)
{
    GtkTreeIter iter;
    GtkTreeModel *model;
    char *value;
    if (gtk_tree_selection_get_selected(GTK_TREE_SELECTION(selection), &model, &iter))
    {
        gtk_tree_model_get(model, &iter, LIST_ITEM, &value,  -1);
        g_print("select item is: %s\n", value);
        g_free(value);
    }
}
int main(int argc,char *argv[ ])
{
    GtkWidget *window,*list;
    GtkTreeSelection *selection;

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

    list = gtk_tree_view_new();
    gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(list), TRUE);

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

    init_list(list);
    init_data(list);

    gtk_container_add(GTK_CONTAINER(window), list);

    gtk_widget_show_all(window);
    gtk_main();
    return 0;
}
和上节的代码一样,只是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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-12-6 11:40:50 | 显示全部楼层
支持楼主。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-25 10:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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