0

我有以下代码:

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。

4

1 回答 1

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);

    ...
于 2013-03-21T12:48:18.427 回答