29

根据 GObject 参考

g_signal_connect_swapped(实例,详细信号,c_handler,数据);将 GCallback 函数连接到特定对象的信号。调用处理程序时发出信号并交换数据的实例。

我不太明白这意味着什么。这是否意味着data将指向指向的对象instance并将instance指向指向的对象data或者我在这里犯了错误?

如果是前者,那么这背后的逻辑是什么?

4

1 回答 1

45

你理解正确。

这允许您执行以下技巧:您有一个按钮(让我们称之为它button),它应该textview在按下时隐藏另一个小部件(让我们称之为它)。

然后你可以做

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

实现这一目标。当按钮被按下时,它会产生'clicked'信号,并且回调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);

基本上,如果您手动编写界面代码,它可以让您不必编写额外的函数。当然,可能还有一些我从未理解过的更实际的用途。

于 2010-01-31T23:37:02.927 回答