马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
这一讲讲解GTK中的列表视图显示,使用的是GtkTreeView部件,GtkTreeView部件可以以列表方式呈现也可以以树状视图方式呈现。
我们先来看看怎么以列表视图呈现。
GtkTreeView部件用MVC模式设计,不懂MVC的可以先看下百科:http://zh.wikipedia.org/zh/MVC
MVC模式将软件分为模型(Model)、视图(View)和控制器(Controller),主要是为了提高各模块的复用性,各模块各司其职自己干自己的事,方便维护。在web开发中经常会看到它的身影。
GtkTreeView可以显示任何“实现”GtkTreeModel接口的对象。这里实现GtkTreeModel接口的对象作为Model的身份出现,为View提供数据。
经常用到的Model有GtkTreeStore和GtkListStore,前者是在树状视图里使用,后者是在列表视图里使用,本文重点讲解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用来获取模型中的数据迭代器。
然后获取选中项的值,将其打印输出。
这个列表视图就说这么多,下一讲讲解树状视图的显示。
|