Skip to main content
 首页 » 编程设计

signals之g_signal_connect swapped() 有什么作用

2024年12月31日15findumars

根据 GObject 引用

g_signal_connect_swapped(instance, detailed_signal, c_handler, data); connects a GCallback function to a signal for a particular object. The instance on which the signal is emitted and data will be swapped when calling the handler.



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

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

请您参考如下方法:

你理解正确。

这允许您执行以下技巧:您有一个按钮(我们称之为 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); 

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