#include <gtk/gtk.h> enum { ID_COLUMN, TEXT_COLUMN, N_COLUMN }; struct ListItem { gint id; gchar* text; } t[5]= {{1,"大明"},{2,"小明"},{3,"测试1"},{4,"text"},{5,"editable"}}; GtkListStore* create_list_model() { GtkListStore *list_store; GtkTreeIter iter; gint i; list_store=gtk_list_store_new(N_COLUMN,G_TYPE_INT,G_TYPE_STRING); for(i=0; i<5; i++) { gtk_list_store_append(list_store,&iter); gtk_list_store_set(list_store,&iter,ID_COLUMN,t[i].id,TEXT_COLUMN,t[i].text,-1); } return list_store; } void cell_edited(GtkCellRendererText *cell,const gchar *path_string,gchar *new_text,gpointer data) { GtkTreeModel *model=(GtkTreeModel *)data; GtkTreePath *path=gtk_tree_path_new_from_string(path_string); GtkTreeIter iter; gint column=GPOINTER_TO_INT(g_object_get_data(G_OBJECT(cell),"column")); gtk_tree_model_get_iter(model,&iter,path); gint i; gchar *old_text; gtk_tree_model_get(model,&iter,column,&old_text,-1); g_free(old_text); i=gtk_tree_path_get_indices(path)[0]; //g_free(t[i].text); //有这个就会报错,地址空间问题? t[i].text=g_strdup(new_text); gtk_list_store_set(GTK_LIST_STORE(model),&iter,column,t[i].text,-1); gtk_tree_path_free(path); } GtkWidget* create_list(GtkListStore *list_store) { GtkWidget *view; GtkTreeModel *model; GtkCellRenderer *renderer; model=GTK_TREE_MODEL(list_store); view=gtk_tree_view_new_with_model(model); renderer=gtk_cell_renderer_text_new(); gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view),ID_COLUMN,"id",renderer,"text",ID_COLUMN,NULL); renderer=gtk_cell_renderer_text_new(); g_object_set(renderer,"editable",TRUE,NULL);//可编辑 g_signal_connect(renderer,"edited",G_CALLBACK(cell_edited),model); g_object_set_data(G_OBJECT(renderer),"column",GINT_TO_POINTER(TEXT_COLUMN)); gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view),TEXT_COLUMN,"text",renderer,"text",TEXT_COLUMN,NULL); return view; } void show(GtkWidget *view) { GtkTreeModel *model; GtkTreeIter iter; int i,num; gchar *str; model=gtk_tree_view_get_model(GTK_TREE_VIEW(view)); for(i=0; i<5; i++) { gtk_tree_model_iter_nth_child(model,&iter,NULL,i); gtk_tree_model_get(model,&iter,ID_COLUMN,&num,TEXT_COLUMN,&str,-1); g_print("%d,%s\n",num,str); } } int main() { GtkWidget *window; GtkWidget *frame; GtkWidget *view; GtkListStore *store; gtk_init(0,NULL); window=gtk_window_new(GTK_WINDOW_TOPLEVEL); g_signal_connect(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL); frame=gtk_frame_new("editable text"); gtk_frame_set_label_align(GTK_FRAME(frame),1.0,0); gtk_container_add(GTK_CONTAINER(window),frame); store=create_list_model(); view=create_list(store); show(view); gtk_container_add(GTK_CONTAINER(frame),view); g_object_unref(store); gtk_widget_show_all(window); gtk_main(); return 0; }
previous post