c - Передача нескольких аргументов в функцию обратного вызова в GTK - PullRequest
4 голосов
/ 13 июля 2011

Итак, я пытаюсь добиться следующего: пользователь сможет заполнить несколько gtk_entry и нажать Apply, после чего при нажатии я хочу, чтобы кнопка Apply испускала сигнал примерно так:

g_signal_connect (G_OBJECT (Применить), "нажал", G_CALLBACK (apply_clicked), # аргумент #);

После этого в apply_clicked() я хочу сохранить введенный текст.

Мой вопрос: как передать эти gtk_entry моей функции обратного вызова apply_clicked? Если бы это был только один, я бы просто установил его как # an argument #, но что мне делать с несколькими записями?

Ответы [ 2 ]

5 голосов
/ 13 июля 2011

Типичный способ сделать это:

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, 2, 3 и т. Д ... и вам не нужно использовать хак g_object_ [g, s] et_data ().

1 голос
/ 13 июля 2011

создайте структуру данных (возможно, связанный список), которая будет содержать указатели на gtk_entry s, и передайте ее вместо этого. Или еще лучше, почему бы просто не передать указатель на объект, который содержит всего этого gtk_entry s?

...