2014-09-30 81 views
1

我想將對象傳遞給「clicked」事件的回調以設置目標標籤的文本。如何將對象傳遞給GTK3回調函數?

這裏是到目前爲止我的代碼:

#include <gtk/gtk.h> 

typedef struct { 
    int i; 
    GtkWidget *target; 
} Data; 

void change(GtkWidget *widget, 
      Data  *data) 
{ 
    gtk_label_set_text(GTK_LABEL(data->target), "it did!"); 
} 

int main(int argc, 
      char* argv[]) 
{ 
    gtk_init(&argc, &argv); 

    GtkWidget *window, *label, *button; 

    Data data; 
    data.i = 0; 
    data.target = label; 

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
    gtk_window_set_title(GTK_WINDOW(window), "GTKdemo"); 
    g_signal_connect(window, "delete-event", G_CALLBACK(gtk_main_quit), NULL); 

    GtkGrid *grid = gtk_grid_new(); 

    button = gtk_button_new_with_label("Click here"); 
    g_signal_connect(button, "clicked", G_CALLBACK(change), &data); 
    gtk_grid_attach(grid, button, 0,0,1,1); 

    label = gtk_label_new("this will change"); 
    gtk_grid_attach(grid, label, 0,1,1,1); 
    gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(grid)); 

    gtk_widget_show_all(window); 

    gtk_main(); 

    return 0; 
} 

我正在嘗試設置的label文被點擊button時。 我試過gtk callback multiple arguments但沒有骰子。幫幫我?

+0

該程序顯示的按鈕和標籤很好,但當我點擊按鈕時崩潰。 'change()'裏面有什麼問題,我只是不知道是什麼。 – clinei 2014-09-30 15:59:13

+0

我需要稍後通過對象提供其他數據。所以不使用對象不是一種選擇。 – clinei 2014-09-30 16:02:23

回答

1

好吧,我通過移動data.target = label來修復它,在g_signal_connect之後執行按鈕。 也許問題是在定義對象變量之前使用指針地址引起的。