将多个参数传递给gtk回调函数

时间:2015-10-12 11:00:42

标签: c linux gtk

我试图将多个参数传递给gtk回调函数 到目前为止,我有以下代码:

void add_new_set(GtkDialog *dialog, gint response_id, gpointer callback_params)
{
  g_print (gtk_entry_get_text (((struct data *) callback_params)->entry));
}

struct data callback_params;
    callback_params.entry = gtk_entry_new();
    gtk_container_add(GTK_CONTAINER(content_area), callback_params.entry);
    g_signal_connect(dialog,"response",G_CALLBACK (add_new_set),&callback_params);

没有得到g_print编辑 我得到了以下错误: (tat:5918):Gtk-CRITICAL **:IA__gtk_entry_get_text:断言' GTK_IS_ENTRY(条目)'失败

(tat:5918):GLib-CRITICAL **:g_print:断言'格式!= NULL'失败

我打开使用除传递结构指针之外的技术

感谢

1 个答案:

答案 0 :(得分:2)

您实际上需要将复合数据打包在堆分配 struct中,并将指针传递给回调。

struct data *cb_data = g_new0(struct data, 1);
cb_data->entry = gtk_entry_new();
cb_data->foo = "somefoo";
g_signal_connect(dialog,"response",G_CALLBACK (add_new_set), cb_data);

但您可能只有一个static类型的struct变量,并将该变量的地址传递给您的回调。这通常是不好的做法,我不建议像这样编码(因为你想要回调是reentrant)。

您无法获取局部变量的地址并将其传递给g_signal_connect(因为GTK信号处理将在您从函数返回后很长时间使用该指针,因此弹出其call frame)。

当然,问题是你的程序应该何时释放cb_data。也许考虑g_signal_connect_datadestroy_data关闭通知。或者连接另一个信号以释放这些数据(dialog上可能widget "destroy"dialog "close" ....)。

您应该考虑使用valgrind来调试memory leaks