gtk默认图标不显示的问题

⌚Time: 2025-04-13 15:34:00

👨‍💻Author: Jack Ge

我使用gtk2.0的系统默认按钮时候,发现这些默认按钮没有了图标,理应有他们的图标的

gtk_button_new_from_stock (GTK_STOCK_PASTE);

运行了gtk2库的demo程序,发现他们的程序在系统里运行时,默认按钮有图标。但是界面风格是陈旧的。

自己运行gtk程序时,我安装的gtk2runtime,还有可以使用gtk开发库里面的库文件运行gtk程序。我猜测gtk-demo程序使用的是开发库的库文件运行的,而我的程序是用gtk2runtime运行的。所以就没了图标。因为我把gtk2runtime排在了gtk开发库的环境变量前面。

当我把gtk2runtime排在gtk开发库的环境变量后。使用的就是gtk开发库运行的gtk2程序。程序界面就改变了,果然就出现了默认图标。

查找资料,发现通过代码能够指定gtk主题。而主题文件一般在开发包或者运行库的share/themes/目录下


GtkSettings *settings = gtk_settings_get_default();
g_object_set(settings, "gtk-theme-name", "MS-Windows", NULL);

我发现使用MS-Windows主题能够显示现代风格的控件样式。但是缺少了gtk默认图标,这就是我一开始程序的样子。

使用默认主题,就是gtk的视觉样式,有图标显示

所以我就尝试通过改变主题来指定有无图标。为了验证,我又把gtk2runtime排在gtk开发库的环境变量前面,使用gtk2runtime运行程序,但是通过代码设置了主题为Raleigh(gtk2runtime主题文件夹下只有3个主题)

GtkSettings *settings = gtk_settings_get_default();
g_object_set(settings, "gtk-theme-name", "Raleigh", NULL);

果然主题改变了,出现了图标。但是不再是windows现代风格的程序。很丑陋。

但是我想怎么样才能使用现代风格的windows程序样式,还能使用默认的主题图标。

我尝试使用MS-Windows主题,然后手动给按钮设置图片。使用的函数是

void                gtk_button_set_image                (GtkButton *button,
                                                         GtkWidget *image);

但是没有用,怎么样这个现代风格的主题,按钮就是不显示图片。无论是自定义图片还是使用默认图标。

最后,我找到了3个能够从默认图标里面提取图片的函数,但是这些也没有用。只能提取图标,并不能显示在按钮上。

GtkWidget*          gtk_image_new_from_stock            (const gchar *stock_id,
                                                         GtkIconSize size);

GdkPixbuf*          gtk_widget_render_icon              (GtkWidget *widget,
                                                         const gchar *stock_id,
                                                         GtkIconSize size,
                                                         const gchar *detail);

void                gtk_image_set_from_stock            (GtkImage *image,
                                                         const gchar *stock_id,
                                                         GtkIconSize size);

最后我发现了deepseek ai提供的一个办法,使用eventbox模拟按钮,这样就是实现了一个可以点击的图片,但是缺点是鼠标移动到上面的时候不会高亮提示。

GtkWidget *event_box = gtk_event_box_new();
GtkWidget *image = gtk_image_new_from_file("icon.png");
gtk_container_add(GTK_CONTAINER(event_box), image);

// 绑定点击事件
g_signal_connect(event_box, "button-press-event", G_CALLBACK(on_button_clicked), NULL);

信号处理函数的形式就是这种

gboolean            user_function                      (GtkWidget      *widget,
                                                        GdkEventButton *event,
                                                        gpointer        user_data);