鱼C论坛

 找回密码
 立即注册
查看: 2011|回复: 2

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

[复制链接]
发表于 2014-12-1 22:13:42 | 显示全部楼层 |阅读模式

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

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

x
gtk_treeview_listview.png

这一讲讲解GTK中的列表视图显示,使用的是GtkTreeView部件,GtkTreeView部件可以以列表方式呈现也可以以树状视图方式呈现。

我们先来看看怎么以列表视图呈现。

GtkTreeView部件用MVC模式设计,不懂MVC的可以先看下百科:http://zh.wikipedia.org/zh/MVC

MVC模式将软件分为模型(Model)、视图(View)和控制器(Controller),主要是为了提高各模块的复用性,各模块各司其职自己干自己的事,方便维护。在web开发中经常会看到它的身影。

GtkTreeView可以显示任何“实现”GtkTreeModel接口的对象。这里实现GtkTreeModel接口的对象作为Model的身份出现,为View提供数据。
经常用到的Model有GtkTreeStoreGtkListStore,前者是在树状视图里使用,后者是在列表视图里使用,本文重点讲解GtkListStore对象。


GtkListStore是MVC中的Model,作为数据提供器,我们把要显示的数据附加到GtkListStore对象,然后把GtkListStore对象与GtkTreeView视图进行关联即可。GtkTreeIter是模型中的数据迭代器,即模型中的数据。


例程:
#include <gtk/gtk.h>

enum
{
  LIST_ITEM = 0,
  N_COLUMNS
};

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

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

    store = gtk_list_store_new(N_COLUMNS, G_TYPE_STRING);

    gtk_tree_view_set_model(GTK_TREE_VIEW(list),GTK_TREE_MODEL(store));

    g_object_unref(store);
}

void add_to_list(GtkWidget *list, const gchar *str)
{
    GtkListStore *store;
    GtkTreeIter iter;

    store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(list)));

    gtk_list_store_append(store, &iter);
    gtk_list_store_set(store, &iter, LIST_ITEM, str, -1);
}
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);
    add_to_list(list, "first line");
    add_to_list(list, "haha");
    add_to_list(list, "g0398");
    add_to_list(list, "fishc");
    add_to_list(list, "last one");
    gtk_container_add(GTK_CONTAINER(window), list);

    gtk_widget_show_all(window);
    gtk_main();
    return 0;
}
init_list函数用来初始化GtkTreeView,变量 renderer和column作为视图,store作为模型。
gtk_cell_renderer_text_new 函数用来创建一个GtkCellRendererText对象。
gtk_tree_view_column_new_with_attributes用来创建一个GtkTreeViewColumn对象,这是GtkTreeView中的列。这个函数有俩个必选参数和一个变长参与列表。
其中第一个参数为列标题,第二个参数为GtkCellRenderer对象,后面的参数列表为列特性。通常情况下我们把它作为枚举值。
gtk_tree_view_append_column 函数用来将GtkTreeViewColumn添加到GtkTreeView。
gtk_list_store_new 函数用来创建一个模型。第一个参数为模型中列个数,第二个参数为模型中各个列的类型GType。
gtk_tree_view_set_model函数用来将模型和视图关联起来。

add_to_list函数用来为模型添加数据。
gtk_tree_veiw_get_model 函数用来获取视图所关联的模型。
gtk_list_store_append 函数用来为模型添加数据迭代器。
gtk_list_store_set 函数用来设置模型数据迭代器的值。这个函数有俩个必选参数和一个可选参数列表,第一个为模型对象,第二个为迭代器,后面的参数列表为列号和值的键值对以-1结束。
gtk_list_store_set(store, &iter, LIST_ITEM, str, -1);
这里的列号为LIST_ITEM,这是我们之前定义的枚举,其值为1,str为要设置显示的字符串数据。

把数据设置完后就可以显示了,
gtk_container_add(GTK_CONTAINER(window), list);
函数用来把这个列表添加到窗体中。
ok,现在执行代码,就能看到图中的效果了。

如果我们要获取列表中所选项的值,就需要GtkTreeSelection对象,gtk_tree_view_get_selection函数用来获取GtkTreeView关联的GtkTreeSelection对象,通知注册这个对象的 changed 信号来获取选中项改变通知。


selection_changed 函数是选中项改变的回调函数。
gtk_tree_selection_get_selected用来获取选中项关联的模型。
gtk_tree_model_get用来获取模型中的数据迭代器。
然后获取选中项的值,将其打印输出。


这个列表视图就说这么多,下一讲讲解树状视图的显示。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-12-1 22:44:00 | 显示全部楼层
标记下,明天看,支持楼主
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-12-27 12:40:28 From FishC Mobile | 显示全部楼层
支持一下!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-18 14:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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