Что делает g_signal_connect_swapped ()? - PullRequest
23 голосов
/ 31 января 2010

Согласно GObject reference

g_signal_connect_swapped (экземпляр, подробный_сигнал, c_handler, данные); соединяет функцию GCallback с сигналом для конкретного объекта. Экземпляр, в котором испускается сигнал и данные обмениваются при вызове обработчика.

Я не совсем понимаю, что это значит. Значит ли это, что data будет указывать на объект, на который указывает instance, а instance будет указывать на объект, на который указывает data, или я здесь ошибаюсь?

Если первое так, то какая логика стоит за этим?

1 Ответ

40 голосов
/ 01 февраля 2010

Вы правильно поняли.

Это позволяет вам выполнять трюки, подобные следующим: У вас есть кнопка (назовем ее button), которая должна скрывать другой виджет (назовем его textview) при нажатии.

Вы можете сделать

g_signal_connect_swapped(button, 'clicked', G_CALLBACK(gtk_widget_hide), textview);

чтобы достичь этого. Когда кнопка нажата, она генерирует сигнал «нажал», и обратный вызов вызывается с textview в качестве первого аргумента и button в качестве второго. В этом случае обратным вызовом является gtk_widget_hide(), который принимает только один аргумент, поэтому второй аргумент игнорируется, потому что так работает соглашение о вызовах C.

Это то же самое, что и ниже, но короче.

static void
on_button_clicked(GtkButton *button, GtkWidget *textview)
{
    gtk_widget_hide(textview);
}

...elsewhere...

    g_signal_connect(button, 'clicked', G_CALLBACK(on_button_clicked), textview);

По сути, это избавляет вас от необходимости писать дополнительные функции, если вы вручную пишете код своего интерфейса. Конечно, может быть гораздо более практичное применение, которого я никогда не понимал.

...