How do I pass multiple variables as data with gtk signals
我有一个小程序,其中 gtk 信号回调函数需要 2 或 3 个变量。
我不想制作这些全局变量(项目的整个目标是整洁),我不想制作一个完整的结构,这样我就可以发送一个小部件和一个编译的正则表达式一个函数。
据我所知,
最有效的方法可能是指向所讨论的两个对象的 void 指针数组吗?像这样?
1
2 3 4 |
void * data[2];
data[0] = widget; data[1] = compiledregex; g_signal_connect(save,"clicked",G_CALLBACK(callbackfunction),data); |
当然你可以使用空指针数组,但是如果你想传递不同类型的值(尤其是类型长于
示例:
1
2 3 4 5 |
struct my_struct *data = malloc(sizeof(*data)); data->field_one = value_one; data->field_two = value_two; /* etc. */ g_signal_connect(save,"clicked", callback, data); |
当然,不要忘记在回调函数中添加
编辑:因为您想要一个带有 void ** 的示例,所以在这里(这很难看,我不建议您使用它——因为为原始类型分配单元素数组会浪费您的射击或因为将非指针投射到 void * 是不好的做法……):
1
2 3 4 5 6 7 |
释放他们:
您可以使用 g_object_set_data() 和 g_object_get_data()。首先,设置数据:
1
2 |
g_object_set_data(G_OBJECT(my_edit),"my_label", my_label);
g_object_set_data(G_OBJECT(my_edit),"age", GINT_TO_POINTER(age)); |
在回调中你可以像这样获取数据:
1
2 |
gint age = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget),"age"));
GtkWidget *my_label = g_object_get_data(G_OBJECT(widget),"my_label"); |
扩展 H2CO3 的答案,您还可以将数据(顺便说一下,我强烈建议使用结构)设置为在信号处理程序断开连接时自动释放:
1
|
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/269298.html