在GTK中传递多个参数给回调函数的C语言实现

4
因此,我正在尝试实现以下功能:用户应该能够填写多个gtk_entry并单击Apply,在点击后,我希望Apply按钮发出一个信号,类似于这样:

g_signal_connect (G_OBJECT (Apply), "clicked", G_CALLBACK(apply_clicked), # an argument #);

之后,在apply_clicked()中,我希望保存输入的文本。
我的问题是:我如何将这些gtk_entry传递给我的回调函数apply_clicked? 如果只有一个,我会将其设置为# an argument #,但对于多个条目,我该怎么办?
2个回答

5
典型的做法是进行以下操作:
g_object_set_data (context_object, "entry1", entry1);
g_object_set_data (context_object, "entry2", entry2);

g_signal_connect (G_OBJECT (Apply), "clicked", G_CALLBACK (apply_clicked), context_object);

然后在 apply_clicked 函数中:

GtkEntry *entry1 = g_object_get_data (context_object, "entry1");
...

通常,context_object 将是 GtkDialog 或任何这些小部件存在的对象。
或者,如果您子类化了 GtkDialog,则可以执行以下操作:
struct _MyDialog {
    GtkDialog parent_object;
    GtkEntry *entry1;
    GtkEntry *entry2;
    ...
};

然后,在构建对话框时,只需设置 entry1、entry2、entry3 等即可,无需使用 g_object_[g,s]et_data() 操作。


好的,我正在使用您提出的第一种方法,现在我想检索文本:gchar *string = gtk_entry_get_text(GTK_ENTRY(entry1));,但它不起作用 - assignment discards ‘const’ qualifier from pointer target type - 为什么会这样? - tesseract
gtk_entry_get_text() 返回的是 const char *,而不是 char *。请将您的代码更改为 const gchar *string = gtk_entry_get_text(GTK_ENTRY(entry1));,这样就可以编译了。 - jstedfast

1
创建一个数据结构(可能是链表),以包含指向gtk_entry的指针,并将其传递。或者更好的方法是,为什么不直接传递指向包含所有这些gtk_entry的对象的指针呢?

这种方法的问题在于内存管理,因为现在你必须将那个列表存储在某个地方,在不再需要时删除它。你可以将其放在GtkDialog上,但为什么不使用我的替代建议呢? :) - jstedfast

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接