2011-07-13 135 views
4

因此,我试图实现以下内容:用户应能够填写多个gtk_entry,然后点击Apply,然后单击我想要的Apply按钮来发射信号,像这样:c - 将多个参数传递给GTK中的回调函数

的g_signal_connect(G_OBJECT(应用), “点击”, G_CALLBACK(apply_clicked),#参数#);

之后,在apply_clicked()中,我希望保存输入的文本。

我的问题是:如何将这些gtk_entry的传递给我的回调函数apply_clicked? 如果只有一个我只是将其设置为# an argument #,但是我应该如何处理多个条目?

回答

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; 
    ... 
}; 

然后,构建你的对话框,只需设置取值范,2,3,等当...你不需要使用g_object_ [g,s] et_data()破解。

+0

好的,所以我使用你的第一种方法,就像你指出的那样,现在我想检索文本:'gchar * string = gtk_entry_get_text(GTK_ENTRY(entry1));',但它不会工作 - '从指针目标类型'分配丢弃'const'限定符 - 为什么会这样? – tesseract

+0

'gtk_entry_get_text()'返回'const char *',而不是'char *'。将你的代码改为'const gchar * string = gtk_entry_get_text(GTK_ENTRY(entry1));'并且它应该被编译。 – jstedfast

+0

好的,谢谢,我忽略了那个。 :) – tesseract

1

创建一个数据结构(或许是一个链表)来包含指向gtk_entry的指针,并通过它。或者更好的是,为什么不传递一个指向包含这个对象的指针gtk_entry

+0

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

相关问题