我正在尝试向我的下一部分教程代码添加一个about对话框,但由于某种原因我无法加载图标。下面是创建和显示对话框的整个功能。
static void help_clicked(GtkButton *button, GtkWindow *window)
{
const gchar *authors[] = { "me", NULL };
const gchar *license = "somestuff";
GdkPixbuf *logo = gdk_pixbuf_new_from_file("logo.png", NULL);
gtk_show_about_dialog(window,
"authors", authors, "license", license, "license-type", GTK_LICENSE_CUSTOM,
"logo", logo, "logo-icon-name", "Logo Icon",
"program-name", "Chapter 6, Exercise 1",
"version", "1.0",
"comments", "This is just an exercise from Chapter 6 of the book I'm reading.",
"website", "http://www.google.com", "website-label", "Application Homepage",
"copyright", "(C) 2014 Patrick Meyer",
"wrap-license", TRUE, NULL);
}
这会产生一个about对话框,其中包含成功设置的每个属性,除了图标。
奇怪的是,当gdk_pixbuf_new_from_file()
向main()
提供gtk_window_set_icon()
时,logo.png
完全相同。这是一个单文件程序,执行目录中存在{{1}}。有什么遗漏?
答案 0 :(得分:4)
如API参考清楚所述,GtkAboutDialog:logo-icon-name
属性会覆盖GtkAboutDialog:logo
属性:
https://developer.gnome.org/gtk3/stable/GtkAboutDialog.html#GtkAboutDialog--logo-icon-name
另外,你传递的logo-icon-name
属性的值并不意味着什么;根据{{3}},logo-icon-name
属性需要命名图标。
只需删除logo-icon-name
属性,您就会看到正确的图标。
作为示例中的旁注:您应该在GdkPixbuf
返回后创建的gtk_show_about_dialog()
对象上释放引用,否则您将泄漏它。理想情况下,因为每次单击帮助按钮时都不想从磁盘加载图像文件,所以应该使用以下内容:
static GdkPixbuf *logo_icon = NULL;
if (logo_icon == NULL)
logo_icon = gdk_pixbuf_new_from_file ("logo.png", NULL);
gtk_show_about_dialog (...);
将在应用期间保持pixbuf。
另一个选择是使用GResource
并将图像数据注入应用程序的二进制文件。
答案 1 :(得分:0)
问题在于logo-icon-name
属性。正如inside the documentation所述,这会覆盖logo
属性。如果遗漏logo-icon-name
属性,徽标将正确显示。
答案 2 :(得分:0)
问题是你也在设置logo-icon-name
,它应该是图标的符号名称,而不是人类描述。
因此正确设置内部图像,然后再次在内部更换。这也解释了为什么之后调用gtk_window_set_icon()
可以正常工作。