如何使用 gtk 信号将多个变量作为数据传递

2024-03-13

我有一个小程序,其中 gtk 信号回调函数需要 2 或 3 个变量。

我不想创建这些全局变量(该项目的整个目标是整洁),并且我不想创建整个结构,以便我可以将小部件和编译的正则表达式发送到函数。

据我所见g_signal_connect只允许单个数据变量。

最有效的方法可能是指向所讨论的两个对象的 void 指针数组?像这样的东西吗?

void * data[2];
data[0] = widget;
data[1] = compiledregex;
g_signal_connect(save,"clicked",G_CALLBACK(callbackfunction),data);

当然,您可以使用 void 指针数组,但是如果您想传递不同类型的值(尤其是类型长于sizeof(void *)),不能使用数组。对于这些,您几乎肯定希望将它们包装在一个结构中,并将结构的地址作为数据参数传递。

Example:

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);

当然,别忘了free(data)在回调函数中(假设它是一次性使用的)。

编辑:正如您想要一个带有 void ** 的示例,这里是(这很丑陋,我不建议您使用它 - 要么因为为原始类型分配单元素数组会浪费您的拍摄,要么因为转换指向 void * 的非指针是不好的做法...):

void **data = malloc(sizeof(data[0]) * n_elements);

type1 *element1_ptr = malloc(sizeof(first_item));
*element1_ptr = first_item;
data[0] = element1_ptr;

/* etc. */

释放他们:

int i;
for (i = 0; i < n_elements; i++)
    free(data[i]);

free(data);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 gtk 信号将多个变量作为数据传递 的相关文章

随机推荐