2014-05-23 133 views
0

我使用GTK + 3.10與Fedora 20下的C來顯示一個窗口,用戶可以從組合框中選擇一個選項,然後按下一個按鈕,該按鈕將顯示帶有選定選項的窗口,圖片。 (我用格萊德設計的用戶界面。)該按鈕的處理函數是GTK斷言失敗第二次

void on_btnDisplay_clicked(GObject *object, gpointer data) 
{ 
    char *selectedText = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(listBox)); 
    char imgPath[50]; 
    memset(imgPath, 0, sizeof(imgPath)); 

    sprintf(imgPath, "images/%s.png", selectedText); 

    gtk_label_set_text(GTK_LABEL(lblText), selectedText); 
    gtk_image_set_from_file(GTK_IMAGE(imgBox), imgPath); 

    gtk_widget_show(wndDisplay); 
} 

給出listBoxlblTextimgBoxwndDisplay有型的GtkWidget的全局*指着小部件在我的UI。沒有破壞wndDisplay的處理程序。

這在第一次嘗試運行時效果很好,但如果關閉顯示窗口,請選擇不同的東西然後重試,失敗,在控制檯中顯示幾個錯誤(但沒有分段錯誤)格式「Gtk-CRITICAL **:...聲明失敗」以及兩個「GLib-GObject-WARNING **:無效的未聲明的演員指針」。

爲什麼第二次嘗試顯示窗口會發生這種情況?我的猜測是我必須以某種方式處理來自窗戶的摧毀信號,但是如何?

回答

0

如果你想消滅你「第二個窗口」,只需使用

g_signal_connect_swapped (wndDisplay, "destroy", 
          G_CALLBACK (gtk_widget_destroy), wndDisplay) 

和你回你的主窗口,如果這是你的問題。 順便說一句,爲什麼你再次使用memset和sprintf?

+0

這不能解決問題。圖像的文件名稱與擴展名爲「.png」的組合框中的選項相對應。我使用sprintf將文件路徑放在一起,並使用memset清除數組在聲明時可能出現的任何垃圾。 – ofperkins

0

我已經設法解決了,我必須在關閉時隱藏窗口而不是銷燬它。所以使用

gtk_widget_hide(wndDisplay) 

來處理窗口的刪除事件將做的伎倆。