gtk2里面g_signal_connect和g_signal_connect_swapped函数

⌚Time: 2025-01-26 15:38:00

👨‍💻Author: Jack Ge

gtk里面有g_signal_connect和一个g_signal_connect_swapped函数。

g_signal_connect是连接控件信号与回调函数的。通过特定的回调函数执行一些功能。

他的第一个参数就是连接的控件,第二个参数是控件信号,第三个参数就是回调函数,第四个参数就是传递给回调函数的自定义数据。

gulong g_signal_connect(gpointer instance, const gchar *detailed_signal, GCallback c_handler, gpointer data);

比如对于gtkbutton的"clicked"信号,他的回调函数形式就是这种。第一个参数就是g_signal_connect绑定的控件指针,第二个参数就是g_signal_connect传递的用户数据,回调函数根据这些参数进行操作。

void                user_function                      (GtkButton *button,
                                                        gpointer   user_data)      : Run First / Action
Emitted when the button has been activated (pressed and released).

button :

the object that received the signal
user_data :

user data set when the signal handler was connected.

g_signal_connect_swapped也是实现一样的功能,区别在于多了"swapped",它会把第四个用户自定义数据交换到第一个参数上。这样传递给回调函数的控件指针就成了用户数据了。这样一些回调函数对于控件的操作可以由用户指定。

例子是一个gtk_widget_destroy函数,它会销毁控件。他的参数只有一个控件指针,

void                gtk_widget_destroy                  (GtkWidget *widget);

如果使用g_signal_connect,当点击按钮,会发现按钮被销毁。

g_signal_connect_swapped(G_OBJECT (closeBtn), "clicked", G_CALLBACK (gtk_widget_destroy), NULL);
    

但是通过g_signal_connect_swapped绑定按钮和gtk_widget_destroy函数,可以实现点击按钮释放窗体,而不是按钮本身了。

g_signal_connect_swapped(G_OBJECT (closeBtn), "clicked", G_CALLBACK (gtk_widget_destroy), window);