2010-12-01 9 views
4

Ich habe eine Software GUI mit Licht und Gtk programmiert. Das Hauptfenster hat einen Über Knopf. Wenn ich zum ersten Mal auf die Schaltfläche klicke, läuft die GtkAboutDialogBox einwandfrei. Der Aktionsbereich ist korrekt an die Ereignisse gebunden. Aber wenn ich es schließe und versuche, den über Dialog (ohne Beendung vom Hauptfenster) wieder zu öffnen, kommt nichts vor. Und zusätzlich das System thowsWie erhalten Sie Assertionsfehler vermeiden beim Laden von GTK Über Dialogfeld?

(tut:5424): GLib-GObject-WARNING **: invalid unclassed pointer in cast to `GtkDialog' 
(tut:5424): Gtk-CRITICAL **: IA__gtk_dialog_run: assertion `GTK_IS_DIALOG (dialog)' failed 
(tut:5424): GLib-GObject-WARNING **: invalid unclassed pointer in cast to `GtkWidget' 
(tut:5424): Gtk-CRITICAL **: IA__gtk_widget_destroy: assertion `GTK_IS_WIDGET (widget)' failed 

an die Shell. Was könnte mit diesem Code falsch sein?

//tut.c 
//gcc -o tut tut.c $(pkg-config --cflags --libs gtk+-2.0 gmodule-2.0) 
#include <gtk/gtk.h> 

GtkBuilder *builder; 
GtkWidget *window,*window_cnb; 
GtkAboutDialog *abtwindow; 
GtkLabel *label; 
GError  *error = NULL; 

void on_about_clicked() { 
    gtk_dialog_run(GTK_DIALOG(abtwindow)); 
    gtk_widget_destroy(GTK_WIDGET(abtwindow)); 
} 

int main(int argc,char **argv) { 
    gtk_init(&argc, &argv); 
    builder = gtk_builder_new(); 
    if(! gtk_builder_add_from_file(builder, "my.glade", &error)) { 
     g_warning("%s", error->message); 
     g_free(error); 
     return(1); 
    } 
    window = GTK_WIDGET(gtk_builder_get_object(builder, "window1")); 
    abtwindow = GTK_ABOUT_DIALOG(gtk_builder_get_object(builder, "aboutdialog1")); 
    label = GTK_LABEL(gtk_builder_get_object(builder, "label16")); 

    gtk_builder_connect_signals(builder, NULL); 
    g_object_unref(G_OBJECT(builder)); 
    gtk_widget_show(window); 
    gtk_main(); 
    return(0); 
} 

Ich benutze gtkbuilder. Wie kann ich es reparieren?

Antwort

3

Verwenden Sie gtk_widget_hide() anstelle von gtk_widget_destroy().

+1

Nun, das hat funktioniert. Danke für die Antwort. –