将多个参数传递给 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。
我正在尝试将多个参数传递给 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。