GTK列表控件--GtkListStore和GtkTreeView的使用

⌚Time: 2022-11-19 23:56:37

👨‍💻Author: Jack Ge

GTK数据列表显示使用的是MVC (Model View Controller) 设计框架。也就是说数据和显示方式是进行了一种分离的操作。

GtkListStore 储存要显示的数据,而GtkTreeView将数据进行显示

g_type类型


(1) #define G_TYPE_INTERFACE G_TYPE_MAKE_FUNDAMENTAL



(2) #define G_TYPE_CHAR G_TYPE_MAKE_FUNDAMENTAL



(3) #define G_TYPE_UCHAR G_TYPE_MAKE_FUNDAMENTAL



(4) #define G_TYPE_BOOLEAN G_TYPE_MAKE_FUNDAMENTAL



(5) #define G_TYPE_INT G_TYPE_MAKE_FUNDAMENTAL



(6) #define G_TYPE_UINT G_TYPE_MAKE_FUNDAMENTAL



(7) #define G_TYPE_LONG G_TYPE_MAKE_FUNDAMENTAL



(8) #define G_TYPE_ULONG G_TYPE_MAKE_FUNDAMENTAL



(9) #define G_TYPE_INT64 G_TYPE_MAKE_FUNDAMENTAL



(10) #define G_TYPE_UINT64 G_TYPE_MAKE_FUNDAMENTAL



(11) #define G_TYPE_ENUM G_TYPE_MAKE_FUNDAMENTAL



(12) #define G_TYPE_FLAGS G_TYPE_MAKE_FUNDAMENTAL



(13) #define G_TYPE_FLOAT G_TYPE_MAKE_FUNDAMENTAL



(14) #define G_TYPE_DOUBLE G_TYPE_MAKE_FUNDAMENTAL



(15) #define G_TYPE_STRING G_TYPE_MAKE_FUNDAMENTAL



(16) #define G_TYPE_POINTER G_TYPE_MAKE_FUNDAMENTAL



(17) #define G_TYPE_BOXED G_TYPE_MAKE_FUNDAMENTAL



(18) #define G_TYPE_PARAM G_TYPE_MAKE_FUNDAMENTAL



(19) #define G_TYPE_OBJECT G_TYPE_MAKE_FUNDAMENTAL

代码


#include <gtk/gtk.h>

int main() {

    

    gtk_init(NULL, NULL);

    GtkWidget *window;

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

    gtk_window_set_default_size(GTK_WINDOW(window), 200, 300);

    gtk_window_set_title(GTK_WINDOW(window), "view");

    //枚举列名称

    enum {COLUMN_NAME,COLUMN_AGE,COLUMN_NUMBER};

    //新建liststore,列类型只支持G_TYPE类型

    GtkListStore *listStore = gtk_list_store_new(COLUMN_NUMBER,G_TYPE_STRING,G_TYPE_INT);

    GtkTreeIter iter;

    //liststore新建项

    gtk_list_store_append(listStore,&iter);

    //设置项

    gtk_list_store_set(listStore,&iter,COLUMN_NAME,"李强",COLUMN_AGE,23,-1);

    //新建项

    gtk_list_store_append(listStore,&iter);

    //设置项

    gtk_list_store_set(listStore,&iter,COLUMN_NAME,"刘伟",COLUMN_AGE,33,-1);

    //新建项

    gtk_list_store_append(listStore,&iter);

    //设置项

    gtk_list_store_set(listStore,&iter,COLUMN_NAME,"王芳",COLUMN_AGE,44,-1);

    //新建项

    gtk_list_store_append(listStore,&iter);

    //设置项

    gtk_list_store_set(listStore,&iter,COLUMN_NAME,"张敏",COLUMN_AGE,34,-1);

    //gtktreeview

    GtkWidget *treeView = gtk_tree_view_new_with_model(GTK_TREE_MODEL(listStore));

    //gtktreeview添加列

    GtkCellRenderer *renderer = gtk_cell_renderer_text_new();

    //GtkCellRendererText的属性text关联liststore中的COLUMN_NAME列

    GtkTreeViewColumn *column = gtk_tree_view_column_new_with_attributes("姓名",renderer,"text",COLUMN_NAME,NULL);

    gtk_tree_view_append_column(GTK_TREE_VIEW(treeView),column);

    //添加列

    renderer = gtk_cell_renderer_text_new();

    column = gtk_tree_view_column_new_with_attributes("年龄",renderer,"text",COLUMN_AGE,NULL);

    gtk_tree_view_append_column(GTK_TREE_VIEW(treeView),column);

    //设置网格

    gtk_tree_view_set_grid_lines(GTK_TREE_VIEW(treeView),GTK_TREE_VIEW_GRID_LINES_BOTH);

    //建立滚动窗口

    GtkWidget *scrolledWindow = gtk_scrolled_window_new(NULL,NULL);

    //设置滚动条出现方式

    gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledWindow),GTK_POLICY_AUTOMATIC,GTK_POLICY_ALWAYS);

    //加入容器

    gtk_container_add(GTK_CONTAINER(window),scrolledWindow);

    gtk_container_add(GTK_CONTAINER(scrolledWindow),treeView);

    //显示所有控件

    gtk_widget_show_all(window);

    //关联回调函数

    g_signal_connect(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);

    gtk_main();

}


结果