gtk2.0在列表项前面显示对应图标

⌚Time: 2025-04-14 16:41:00

👨‍💻Author: Jack Ge

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;
}

效果