GTK3 +

2017-12-04 7 views
1

で情報ダイアログを表示していませんgtk_drawing_areaがクリックされたときに情報ダイアログウィンドウを表示しようとしています。ここで GTK3 +

は、私が使用していますコードです:私はコンパイルして、コマンド gccのdialog.cを使用してこのコードを実行すると

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

pkg-config --cflags gtk+-3.0 --libs --libs cairo -lm -oダイアログ& & ./dialog私は次の取得端末上:

セグメンテーションフォールト

のような任意の提案どのような私が間違っているの(コアダンプ)?

+1

コードをデバッグするのに 'gdb'と' valgrind'を使います。エラーの原因となる行を見つけてそこから開始する –

+0

パラメータを追加する 'gcc'に' -Wall'と '-Wextra'を追加することは、 – purplepsycho

答えて

2

問題はコールバック関数にあります。 API referenceに記載されているように、

void user_function(GtkWidget *widget, gpointer window) 

、それは次のようになります:

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

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

があなたのコールバックを適応、それはこのようなものでなければなりませんあなたは、次のプロトタイプを使用していますTRUEを返すと、信号伝播が停止します。

変更後、プログラムは正常に動作するはずです。どのボタンが押されたかなど、eventのイベント情報にアクセスできます。

関連する問題