g_signal_connect swapped()做什么?

时间:2010-01-31 12:57:48

标签: signals gtk gobject

根据GObject参考

  

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

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

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

1 个答案:

答案 0 :(得分:40)

你理解正确。

这允许你做如下的技巧:你有一个按钮(我们称之为button),按下时应该隐藏另一个小部件(让我们称之为textview)。 p>

然后你可以做

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);

基本上,如果您对界面进行手动编码,它将使您不必编写额外的功能。当然,可能有一些我从未理解的实际用途。