GTK+编程入门(3)—响应GKT+的信号

本文是GTK+编程入门系列的第三篇,主要讲解如何响应GTK+的信号,包括事件和信号的概念、g_signal_connect函数、g_signal_connect_swapped函数的使用,以及手动触发信号的方法。此外,还介绍了GTK+中常见的事件类型,如GdkEventButton、GdkEventKey、GdkEventConfigure和GdkEventFocus。
摘要由CSDN通过智能技术生成

GTK+编程入门(2)—响应GTK+的信号(2015-7-24)

分类:GTK+

  在这之前,先来看一个对上一个简单程序的改进程序gtk.c。

#include <gtk/gtk.h>

static void hello(GtkWidget *widget, gpointer data){    
    /* 输出信息 */                      
    g_printf("Hello World!\n");
}

static gboolean delete_event(GtkWidget *widget, GdkEvent *event, gpointer data){
    g_printf("delete event occurred.\n");

    /* 如果返回FALSE,GTK+会发出一个“destroy”信号 */
    return TRUE;
}

static void destroy(GtkWidget *widget, gpointer data){
    /* 输出构件的名字 */
    g_printf("%s :exit!\n", gtk_widget_get_name(widget));

    /* 退出主循环 */
    gtk_main_quit();
}

int main(int argc, char *argv[])
{
    GtkWidget *window;
    GtkWidget *button;

    gtk_init(&argc, &argv);

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

    /* 注册回调函数 */
    g_signal_connect(window, "delete-event", G_CALLBACK(delete_event), NULL);
    g_signal_connect(window, "destroy", G_CALLBACK(destroy), NULL);

    /* 设置窗口边距 */
    gtk_container_set_border_width(GTK_CONTAINER(window), 10);
    /* 设置构件名称 */
    gtk_widget_set_name(GTK_WIDGET(window), "MainWindow");
    /* 创建一个按钮 */
    button = gtk_button_new_with_label("Hello World!");

    /* 注册单击按钮事件的回调函数 */
    g_signal_connect(button, "clicked", G_CALLBACK(hello), NULL);
    g_signal_connect_swapped(button, "clicked", G_CALLBACK(gtk_widget_destroy), window);
    /* 把构件添加到窗口内 */
    gtk_container_add(GTK_CONTAINER(window), button);

    /* 显示按钮 */
    gtk_widget_show(button);
    /* 显示窗口 */
    gtk_widget_show(window);

    /* 进入GTK+主循环 */
    gtk_main();

    return 0;
}

  它的编译和运行:

biantiao@lazybone1994-ThinkPad-E430:~/sh/GTK+$ gcc -o ex_gtk ex_gtk.c `pkg-config --cflags --libs gtk+-3.0`
biantiao@lazybone1994-ThinkPad-E430:~/sh/GTK+$ ./ex_gtk
Hello 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值