gtk2.0在列表项前面显示对应图标。并不是在单独一列显示图标,而是在同一列显示图标和对应的内容。这用到多个渲染器。
测试程序是这个,功能是显示gtk所有内置图标和id,在同一列中。
#include <gtk/gtk.h>
int main(int argc, char *argv[])
{
gtk_init(&argc, &argv);
// 创建主窗口
GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "GTK Stock icons list");
gtk_window_set_default_size(GTK_WINDOW(window), 400, 600);
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
// 创建滚动窗口
GtkWidget *scrolled_window = gtk_scrolled_window_new(NULL, NULL);
gtk_container_add(GTK_CONTAINER(window), scrolled_window);
// 创建树视图
GtkWidget *treeview = gtk_tree_view_new();
gtk_container_add(GTK_CONTAINER(scrolled_window), treeview);
// 创建列表存储,只需要一列存储stock ID
GtkListStore *store = gtk_list_store_new(1, G_TYPE_STRING);
// 设置树视图的模型
gtk_tree_view_set_model(GTK_TREE_VIEW(treeview), GTK_TREE_MODEL(store));
// 创建列
GtkTreeViewColumn *column;
GtkCellRenderer *cell_renderer;
column = gtk_tree_view_column_new();
gtk_tree_view_column_set_title(column, "GTK Stock icons");
// 添加图标渲染器
cell_renderer = gtk_cell_renderer_pixbuf_new();
//将图标渲染器添加到列的最前方,不自动扩充
gtk_tree_view_column_pack_start(column, cell_renderer, FALSE);
//设置渲染器属性:使用模型中的第0列数据作为 stock_id(GTK 内置图标ID)
gtk_tree_view_column_set_attributes(column, cell_renderer,
"stock-id", 0, NULL);
// 添加文本渲染器
cell_renderer = gtk_cell_renderer_text_new();
//添加渲染器到列,自动扩充
gtk_tree_view_column_pack_start(column, cell_renderer, TRUE);
gtk_tree_view_column_set_attributes(column, cell_renderer,
"text", 0, NULL);
// 将列添加到树视图
gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
// 获取所有stock项并添加到列表
GSList *stock_ids = gtk_stock_list_ids();
GSList *iter;
for (iter = stock_ids; iter != NULL; iter = iter->next)
{
const gchar *stock_id = (const gchar *)iter->data;
GtkTreeIter tree_iter;
gtk_list_store_append(store, &tree_iter);
gtk_list_store_set(store, &tree_iter, 0, stock_id, -1);
}
g_slist_free(stock_ids);
// 显示所有控件
gtk_widget_show_all(window);
gtk_main();
return 0;
}效果