g_signal_connect() 和 g_signal_connect_swapped()的区别

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

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

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

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

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

另外,在使用gtkbuilder和glade构建程序的时候,会调用下面的函数连接object, signal, callback func, user_data, 这个函数有一个可选的swapped标志。

GtkBuilderConnectFunc ()
void (*GtkBuilderConnectFunc) (GtkBuilder *builder,
GObject *object,
const gchar *signal_name,
const gchar *handler_name,
GObject *connect_object,
GConnectFlags flags,
gpointer user_data);

其中

enum GConnectFlags
typedef enum
{
G_CONNECT_AFTER = 1 << 0,
G_CONNECT_SWAPPED = 1 << 1
} GConnectFlags;

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

updatedupdated2022-02-222022-02-22