Home GTK gtktreeview设置可编辑单元格以及遍历显示整个数据
#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;
}

打赏
0 comment

You may also like

Leave a Comment

*

code

error: Alert: Content is protected !!