我试图将多个参数传递给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'失败
我打开使用除传递结构指针之外的技术
感谢
答案 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_data有destroy_data
关闭通知。或者连接另一个信号以释放这些数据(dialog
上可能widget "destroy"或dialog "close" ....)。
您应该考虑使用valgrind来调试memory leaks。