g_signal_connect_swapped()是做什么的?

30
根据 GObject 参考文档,g_signal_connect_swapped(instance, detailed_signal, c_handler, data); 连接一个 GCallback 函数到特定对象的信号。当调用处理函数时,会交换发射信号的实例和数据。
我不太明白这是什么意思。这是否意味着 data 将指向 instance 指向的对象,并且 instance将指向指向 data 的对象,还是我理解有误?
如果前者是正确的,那么背后的逻辑是什么?
1个回答

47

你理解得没错。

这使您可以执行以下操作:您有一个按钮(我们称其为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);

基本上它可以帮助你省去编写额外函数的步骤,如果你手工编写接口的话。当然,可能还有一些更实用的用途我从未理解。


3
这也适用于通常使用self作为第一个参数来调用来自子元素的事件处理程序,例如:g_signal_connect_swapped (self->some_internal_child, "button-press-event", (GCallback)my_mouse_handler, self)。如果没有使用swapped,那么在接收端会有一个丑陋的签名,第一个参数在大多数情况下可能并不重要,而且你通常可以从self->中获取它。至少到目前为止,这就是我对它的使用方式... - underscore_d

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接