我使用gtk2.0的系统默认按钮时候,发现这些默认按钮没有了图标,理应有他们的图标的
运行了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主题,然后手动给按钮设置图片。使用的函数是
但是没有用,怎么样这个现代风格的主题,按钮就是不显示图片。无论是自定义图片还是使用默认图标。
最后,我找到了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);
信号处理函数的形式就是这种