根据GObject参考
g_signal_connect_swapped(instance,detailed_signal,c_handler,data);将GCallback函数连接到特定对象的信号。调用处理程序时将发出信号的实例和数据将被交换。
我不明白这意味着什么。这是否意味着data
将指向instance
指向的对象,而instance
将指向data
指向的对象或我是否犯了错误这里吗?
如果是前者,那么这背后的逻辑是什么?
答案 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);
基本上,如果您对界面进行手动编码,它将使您不必编写额外的功能。当然,可能有一些我从未理解的实际用途。