2017-12-04 8 views
1

Ich versuche, ein Info-Dialogfenster anzuzeigen, wenn auf den gtk_drawing_area geklickt wird. HierFehler beim Anzeigen des Info-Dialogs in GTK3 +

ist der Code, ich verwende:

#include <cairo.h> 
#include <gtk/gtk.h> 

void show_dialog_window(GtkWidget *widget, gpointer window) { 

    GtkWidget *dialog; 
    dialog = gtk_message_dialog_new(GTK_WINDOW(window), 
      GTK_DIALOG_DESTROY_WITH_PARENT, 
      GTK_MESSAGE_INFO, 
      GTK_BUTTONS_OK, 
      "Hello dialog!"); 
    gtk_window_set_title(GTK_WINDOW(dialog), "Information"); 
    gtk_dialog_run(GTK_DIALOG(dialog)); 
    gtk_widget_destroy(dialog); 
} 

int main(int argc, char *argv[]) 
{ 
    GtkWidget *window; 
    GtkWidget *darea; 

    gtk_init(&argc, &argv); 

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); 
    gtk_window_set_default_size(GTK_WINDOW(window), 400, 300); 
    gtk_window_set_title(GTK_WINDOW(window), "Click me to show an Info_Dialog"); 

    darea = gtk_drawing_area_new(); 
    gtk_container_add(GTK_CONTAINER(window), darea); 

    gtk_widget_add_events(window, GDK_BUTTON_PRESS_MASK); 

    g_signal_connect(window, "destroy", 
     G_CALLBACK(gtk_main_quit), NULL); 
    g_signal_connect(window, "button-press-event", 
     G_CALLBACK(show_dialog_window), (gpointer) window); 


    gtk_widget_show_all(window); 

    gtk_main(); 

    return 0; 
} 

Wenn ich kompilieren und diesen Code ausführen mit dem Befehl gcc dialog.c pkg-config --cflags gtk+-3.0 --libs --libs cairo -Im -o Dialog & & ./dialog ich folgende auf dem Terminal:

Segmentation fault (core dumped)

Jeder Vorschlag, was ich falsch mache?

+1

Verwenden Sie 'gdb' und' valgrind', um Ihren Code zu debuggen. Suchen Sie die Zeile, die den Fehler verursacht, und starten Sie von dort aus –

+0

Das Hinzufügen der Parameter '-Wall' und' -Wextra' zu 'gcc' könnte eine gute Idee sein – purplepsycho

Antwort

2

Das Problem liegt in der Callback-Funktion. Sie sind mit dem folgenden Prototyp:

void user_function(GtkWidget *widget, gpointer window) 

und es sollte sein, in der API reference wie dokumentiert:

gboolean user_function(GtkWidget *widget, GdkEvent *event, gpointer user_data) 

Anpassung Ihren Rückruf, sollte es so etwas wie dieses:

gboolean show_dialog_window(GtkWidget *widget, GdkEvent *event, gpointer window) { 

    GtkWidget *dialog; 
    dialog = gtk_message_dialog_new(GTK_WINDOW(window), 
      GTK_DIALOG_DESTROY_WITH_PARENT, 
      GTK_MESSAGE_INFO, 
      GTK_BUTTONS_OK, 
      "Hello dialog!"); 
    gtk_window_set_title(GTK_WINDOW(dialog), "Information"); 
    gtk_dialog_run(GTK_DIALOG(dialog)); 
    gtk_widget_destroy(dialog); 
    return TRUE; 
} 

Die Rückkehr TRUE stoppt die Signalausbreitung.

Nach der Änderung sollte das Programm gut funktionieren. Sie können auf Ereignisinformationen unter event zugreifen, z. B. welche Taste gedrückt wurde usw.

Verwandte Themen