Signals/Callback/Data的使用说明
1.代码说明
- 通过
time_to_go()
说明gpointer
类型参数data
的传入与使用 - 通过
gtk_widget_destroy()
和button_clicked_cb()
的使用,说明较短形式的信号-回调函数的连接方式 - 通过
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL /*GTK_ORIENTATION_HORIZONTAL*/, 2);
说明Gtk+3中box容器的使用方式
2.源码如下(boxes.c)
#include <gtk/gtk.h>
#define NUM_NAMES 4
const gchar* names[] = { "Andrew", "Joe", "Samantha", "Jonathan" };
/* Stop the GTK+ main loop function. */
static void
time_to_go (GtkWidget *window,
gpointer data)
{
g_print("Time to go,please say: %s",(gchar *)data);
gtk_main_quit ();
}
//用于g_signal_connect(),以便和g_signal_connect_swapped()函数的使用进行对比
/*static void
button_clicked_cb (GtkButton *button,
GtkWidget *other_widget)
{
gtk_widget_destroy (other_widget);
}*/
int main (int argc,
char *argv[])
{
gint i;
GtkWidget *window, *vbox;
gtk_init (&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW (window), "Boxes");
gtk_container_set_border_width (GTK_CONTAINER (window), 10);
gtk_widget_set_size_request (window, 200, -1);
g_signal_connect (G_OBJECT (window), "destroy",
G_CALLBACK (time_to_go),"Bye,Boxes!"/*对应回调函数中所需数据-gpointer data*/);
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL /*GTK_ORIENTATION_HORIZONTAL*/, 2);
/* Add four buttons to the vertical box. */
for (i = 0; i < NUM_NAMES; i++)
{
GtkWidget *button = gtk_button_new_with_label (names[i]);
gtk_box_pack_start(GTK_BOX (vbox), button, FALSE,FALSE,2);
//------------------------------------------------------------
//较短的信号-回调形式,可以直接传入特定的对象参数button给指定回调函数,
//如gtk_widget_destroy,该形式更简洁.
//------------------------------------------------------------
g_signal_connect_swapped (button, "clicked",
(GCallback) gtk_widget_destroy,
(gpointer) button);
//----------------------------------------------
//较长的信号-回调形式,需要定义单独的回调函数,
//如button_clicked_cb(),并传入特定的对象参数button
//----------------------------------------------
/*g_signal_connect (button, "clicked",
(GCallback) button_clicked_cb,
(gpointer) button);*/
}
gtk_container_add (GTK_CONTAINER (window), vbox);
gtk_widget_show_all (window);
gtk_main ();
return 0;
}
3.运行结果
boxes