2010-12-01 6 views
4

J'ai programmé une interface logicielle utilisant glade et gtk. La fenêtre principale a un bouton À propos de. Lorsque je clique sur le bouton pour la première fois, le GtkAboutDialogBox fonctionne parfaitement. La zone d'action est correctement liée aux événements. Mais quand je le ferme et essaie à nouveau d'ouvrir le dialogue à propos (sans quitter la fenêtre principale), rien ne se lève. Et en outre, le systèmeComment éviter l'échec d'assertion lors du chargement de gtk A propos de la boîte de dialogue?

(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 

à l'enveloppe. Quel pourrait être le problème avec ce code?

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

J'utilise gtkbuilder. Comment puis-je le réparer?

Répondre

3

Utilisez gtk_widget_hide() à la place de gtk_widget_destroy().

+1

Eh bien, cela a fonctionné. Merci pour la réponse. –

Questions connexes