G0398 发表于 2014-12-6 11:15:14

C语言GUI程序设计-GTK图文系列-树状视图



这一讲讲解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。

565266718 发表于 2014-12-6 11:40:50

支持楼主。。。。
页: [1]
查看完整版本: C语言GUI程序设计-GTK图文系列-树状视图