2015-11-06 31 views
1

我有一些按钮,我想跟踪按下了哪个按钮。按钮被按下后,我需要显示不同的数据的新窗口或对话框中被按下gtk处理程序有错误的数据

for(j = 0; j < 4; j++) 
{ 
    eventbox = gtk_event_box_new(); 
    show_button[j] = gtk_button_new_with_label (label); 
    gtk_table_attach_defaults (GTK_TABLE (table), eventbox, left_pos, right_pos , top_pos, bot_pos); 
    gtk_container_add(GTK_CONTAINER(eventbox), show_button[j]); 
    g_signal_connect (G_OBJECT (show_button[j]), "clicked", G_CALLBACK (show), &j); 

    left_pos = right_pos + shift; 
    right_pos = left_pos + width; 
    gtk_widget_modify_bg(eventbox, GTK_STATE_NORMAL, &color[0]);     
} 

按钮的依赖和我的处理程序是

void show(GtkWidget *window, gpointer data) 
{ 
    int i = *(int*)data; 
    printf("%d\n", i); 
    GtkWidget *marking_table; 
    window[i] = gtk_window_new (GTK_WINDOW_POPUP); 
    gtk_widget_set_size_request(window[i], 1000, 700); 
    gtk_window_set_policy (GTK_WINDOW (window[i]), FALSE, FALSE, TRUE); 
    gtk_window_set_position(GTK_WINDOW(window[i]), 1); 
    gtk_widget_set_app_paintable(window[i], TRUE); 
    g_signal_connect (G_OBJECT (window[i]), "delete_event", G_CALLBACK (delete_event), NULL); 
    marking_table = gtk_table_new (1000, 700, TRUE); 
    gtk_container_add (GTK_CONTAINER (window[i]), marking_table); 
} 

我经常因为段错误的“i”例如= 20350345。可能有另一种方法来了解按钮被按下了哪个按钮?

欢迎任何帮助!

回答

2

您的用户数据是指向'j'的指针。当'j'超出范围时,指针始终指向内存,然后可用于其他内容。

你必须无论是对用户数据(通常是你需要的所有数据结构)分配内存或者在这个特殊的情况下,你只需要一个诠释,你也可以使用GLib Type Conversion Macros

g_signal_connect (G_OBJECT (show_button[j]), "clicked", 
        G_CALLBACK (show), GINT_TO_POINTER(j)); 

然后在处理程序中使用int i = GPOINTER_TO_INT(data)

+0

谢谢,它帮助了我。 – iiukyr4uk