GTK3 +

2017-12-04 17 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의 이벤트 정보에 액세스 할 수 있습니다.