GTK中g_signal_connect与g_signal_connect_swapped的区别

⌚Time: 2022-07-12 16:10:53

👨‍💻Author: Jack Ge

g_signal_connect:


gulong g_signal_connect( gpointer *object,

                         const gchar *name,

                         GCallback func,

                         gpointer func_data );

用于连接事件与回调函数,如通过


g_signal_connect(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);    

将窗口销毁事件与gtk_main_quit函数关联,使得窗口点击关闭退出窗口

g_signal_connect_swapped


#define g_signal_connect_swapped (

  instance,

  detailed_signal,

  c_handler,

  data

)

顾名思义,交换参数。对于回调函数


void callback_function(GtkWidget * widget, gpointer data)

{

    ...

}

g_signal_connect会将第一个和第四个参数传入回调函数的GtkWidget *和gpointer。而g_signal_connect_swapped将第四个参数传入回调函数的GtkWidget *,并且忽略gpointer。

也就是说使用g_signal_connect的代码


static void

button_clicked_cb (GtkButton *button, GtkWidget *other_widget)

{

    gtk_widget_hide (other_widget);

}



...



g_signal_connect (button, "clicked",

                  (GCallback) button_clicked_cb, other_widget);

可以g_signal_connect_swapped写成


g_signal_connect_swapped (button, "clicked",

                          (GCallback) gtk_widget_hide, other_widget);

我写程序测试他们的区别


#include <gtk/gtk.h>

void change_color_0(GtkWidget * widget, gpointer data)

{

    GdkColor color;

    color.red = 30000;

    color.blue = 0;

    color.green = 20000;

    gtk_widget_modify_bg(widget,GTK_STATE_NORMAL,&color);

}

void change_color_1(GtkWidget * widget, gpointer data)

{

    GdkColor color;

    color.red = 10000;

    color.blue = 55555;

    color.green = 20000;

    gtk_widget_modify_bg(widget,GTK_STATE_NORMAL,&color);

}



int main(int argc,char* argv[]){





    GtkWidget *window;

    GtkWidget *button;

    GtkWidget *fixed;

    gtk_init(&argc,&argv);

 

    window=gtk_window_new(GTK_WINDOW_TOPLEVEL);

    gtk_window_set_title(GTK_WINDOW(window),"drawDemo");

    gtk_window_set_default_size(GTK_WINDOW(window),300,200);

    

    fixed = gtk_fixed_new();

    gtk_container_add(GTK_CONTAINER(window),fixed);

    button = gtk_button_new_with_label("click me");

    gtk_fixed_put(GTK_FIXED(fixed),button,100,100);

    

    g_signal_connect(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);

    g_signal_connect (button, "button-press-event", G_CALLBACK (change_color_0), NULL);

    g_signal_connect_swapped (button, "button-press-event", G_CALLBACK (change_color_1), window);



    gtk_widget_show_all(window);



    gtk_main();

 

    return 0;

}


点击button后,窗体和按钮颜色分别发生了改变