2013-03-21 33 views
0

我有以下代碼:GtkWidget的回調(切換按鈕)不通過數據

int DT=45; 
g_print("--Set: %d\n",DT); 
g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(cave_dive_toggle_cb), (gpointer) &DT); 

和回調函數:

void cave_dive_toggle_cb(GtkWidget *widget, gpointer data) 
{ 
    int *ID=(int *)data; 
    int DT= *ID; 
    if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) 
    g_print("clicked %d\n",DT); 
    else 
    g_print("unclicked %d\n",DT); 
} 

在打開的對話框中,點擊按鈕,我總是看到:

--Set: 45 
clicked 0 
unclicked 0 
clicked 0 
unclicked 0 
clicked 0 
unclicked 0 

我做錯了什麼?據我瞭解Gtk文檔,我不是。我也嘗試了交換版本,並採取了第一個參數,以確保我寫了正確的CB。

回答

0

問題是,DT是一個局部變量,所以一旦函數退出它不再存在。你需要做的是使用GINT_TO_POINTER和GPOINTER_TO_INT宏像這樣:

g_signal_connect (G_OBJECT (button), "toggled", G_CALLBACK (cave_dive_toggle_cb), GINT_TO_POINTER (DT)); 

void cave_dive_toggle_cb (GtkWidget *widget, gpointer data) 
{ 
    int DT = GPOINTER_TO_INT (data); 

    ... 
+1

非常感謝!我認爲DT存在,直到對話框打開。也許我會讀一些關於GTK的內容;)謝謝! – user2194898 2013-03-21 14:38:25

+0

很酷。如果它適合你,請點擊向上箭頭並接受答案 – iain 2013-03-21 15:02:16