2014-02-11 61 views
1

我試圖添加一個關於對話框到我的下一個教程代碼,但我無法得到圖標加載出於某種原因。以下是創建和顯示對話框的全部功能。GtkAboutDialog圖標未加載?

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

這會導致一個關於對話框,每個屬性都成功設置,除了圖標。

奇怪的是,當我將它提供給gtk_window_set_icon()時,與gdk_pixbuf_new_from_file()完全相同的呼叫在main()中工作。這是一個帶有logo.png的單文件程序,位於執行目錄中。少了什麼東西?

回答

4

的API參考中明確規定,在GtkAboutDialog:logo-icon-name屬性將覆蓋GtkAboutDialog:logo屬性:

https://developer.gnome.org/gtk3/stable/GtkAboutDialog.html#GtkAboutDialog--logo-icon-name

也,你傳遞的logo-icon-name財產,這並不意味着任何一個值;根據Icon Naming Specificationlogo-icon-name屬性需要命名圖標

只是刪除logo-icon-name屬性,你會看到正確的圖標。

作爲你的例子的一個附註:你應該在gtk_show_about_dialog()返回後釋放你創建的GdkPixbuf對象的引用,否則你會泄漏它。理想情況下,雖然,因爲你不希望你點擊幫助按鈕每次從磁盤加載鏡像文件,你應該使用這樣的事情:

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並將圖像數據注入到應用程序的二進制文件中。

0

問題出在logo-icon-name屬性。正如inside the documentation所述,這將覆蓋logo屬性。如果您遺漏了logo-icon-name屬性,徽標將正確顯示。

0

問題是你也設置logo-icon-name這應該是一個圖標的符號名稱,而不是人類的描述。

因此,內部圖像被正確設置,然後在第二次內部更換。這也解釋了爲什麼之後致電gtk_window_set_icon()正常工作。