g_signal_connect() 和 g_signal_connect_swapped()的区别

gtk编程中常用到这两个函数,但是很多人对这两个函数的区别却不太清楚,至少是解释得不够准确。

我在这里找到了确却的解释:
http://gtkforums.com/viewtopic.php?t=1177

简单的说,swapped函数会交换回调函数参数的顺序。

这有什么好处?从例子上看:

<br /> /*这个函数会删除button,尽管用户数据的值是other_widget*/<br /> /* this will delete 'button' on its clicked signal, even though we're passing 'other_widget' as user_data */<br /> g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(gtk_widget_destroy), (gpointer)other_widget);<br /> /*这个函数会删除other_widget*/<br /> /* this will delete 'other_widget' on button's clicked signal */<br /> g_signal_connect_swapped(G_OBJECT(button), "clicked", G_CALLBACK(gtk_widget_destroy), (gpointer)other_widget);<br />

另外,在使用gtkbuilder和glade构建程序的时候,会调用下面的函数连接object, signal, callback func, user_data, 这个函数有一个可选的swapped标志。
<br /> GtkBuilderConnectFunc ()<br /> void (*GtkBuilderConnectFunc) (GtkBuilder *builder,<br /> GObject *object,<br /> const gchar *signal_name,<br /> const gchar *handler_name,<br /> GObject *connect_object,<br /> GConnectFlags flags,<br /> gpointer user_data);

其中
enum GConnectFlags<br /> typedef enum<br /> {<br /> G_CONNECT_AFTER = 1 << 0,<br /> G_CONNECT_SWAPPED = 1 << 1<br /> } GConnectFlags;

glade中没有swapped的选项,连接时似乎默认swapped=”TRUE”,需要手动更改xml文件使之符合自己的需要。

updatedupdated2022-02-222022-02-22