gtk 处理程序有错误数据

gtk handler has bad data

我有一些按钮,我想跟踪按下了哪个按钮。按下按钮后,我需要根据按下的按钮显示一个新的 window 或具有不同数据的对话框

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。可能有另一种方法来了解按下了什么按钮?

欢迎任何帮助!

您的用户数据是指向 'j' 的指针。当 'j' 超出范围时,指针将继续指向内存,然后可以将其用于其他用途。

你必须为用户数据分配内存(通常是一个包含你需要的所有数据的结构)或者在这种特殊情况下你只需要一个 int 你也可以使用 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)