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

passing multiple arguments to a gtk callback function

我正在尝试将多个参数传递给 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 (entry)' 失败

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

我愿意使用传递结构指针以外的技术

谢谢

您实际上需要将复合数据打包到堆分配 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_data which has a destroy_data closure notification. Or connect another signal to free that data (perhaps widget "destroy" or dialog "close" 在你的 dialog ....)。

您应该考虑使用 valgrind to debug memory leaks