列表视图 实现双击修改内容
可以给一个比较完整的代码示例吗?看了MSDN不是很明白。
我们先来看看怎么以列表视图呈现。
GtkTreeView部件用MVC模式设计,不懂MVC的可以先看下百科:http://zh.
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; }