使用GtkTreeView控件显示包含文本和图片的列表,GtkTreeView/GtkListStore或者GtkTreeView/GtkTreeModel使用的是MVC设计理念。
关于MVC:
M层: model 数据模型层(处理数据的增删改查) 提供数据
V层: Views 视图层 (数据展示) 渲染数据
C层: controller 控制层(处理业务逻辑) 调用数据渲染视图
使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。
GtkListStore、GtkTreeModel、GtkTreeView
GtkListStore 一个能被GtkTreeView使用的列表数据结构
GtkTreeModel 是GtkTreeView的接口
通过GTK_TREE_MODEL宏可以将GtkListStore转换成GtkTreeModel
代码
#include <gtk/gtk.h>int main(int argc, char *argv[])
{GtkWidget *window;GtkWidget *treeview;GtkListStore *liststore;GtkTreeViewColumn *column;GtkCellRenderer *cell;GtkTreeIter iter;GdkPixbuf *pixbuf;// 初始化GTKgtk_init(&argc, &argv);// 创建窗口window = gtk_window_new(GTK_WINDOW_TOPLEVEL);gtk_window_set_default_size(GTK_WINDOW(window), 200, 200);// 创建列表存储liststore = gtk_list_store_new(2, GDK_TYPE_PIXBUF, G_TYPE_STRING);// 添加图像和文本到列表存储pixbuf = gdk_pixbuf_new_from_file("image.jpg", NULL);gtk_list_store_append(liststore, &iter);gtk_list_store_set(liststore, &iter, 0, pixbuf, 1, "Image 1", -1);//添加图片和文本到行g_object_unref(pixbuf);//释放资源pixbuf = gdk_pixbuf_new_from_file("image2.jpg", NULL);gtk_list_store_append(liststore, &iter);gtk_list_store_set(liststore, &iter, 0, pixbuf, 1, "Image 2", -1);g_object_unref(pixbuf);// 创建列表视图treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(liststore));// 创建图像列cell = gtk_cell_renderer_pixbuf_new();column = gtk_tree_view_column_new_with_attributes("Image", cell, "pixbuf", 0, NULL);//创建名为Image的图像列gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);//添加图像列// 创建文本列cell = gtk_cell_renderer_text_new();column = gtk_tree_view_column_new_with_attributes("Text", cell, "text", 1, NULL);//创建名为Text的文本列gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);//添加文本列// 将列表视图添加到窗口中gtk_container_add(GTK_CONTAINER(window), treeview);// 显示窗口gtk_widget_show_all(window);// 运行主循环gtk_main();return 0;
}
结果