GTK入门学习:信号与回调函数

前面我们学习的GTK界面都是静态的,我们按下按钮它是没有响应的,如何让它有响应呢?接下来我们一起学习GTK的信号与回调函数。


GTK采用了信号与回调函数来处理窗口外部传来的事件、消息或信号。当信号发生时,程序自动调用为信号连接的回调函数。


学习应用编程,我们会经常接触到“信号”这个名词。GTK中的“信号”实际上是一种软件中断。“中断”在我们生活中经常遇到,譬如,我正在房间里打游戏,突然送快递的来了,把正在玩游戏的我给“中断”了,我去签收快递( 处理中断 ),处理完成后,再继续玩我的游戏。GTK中的“信号”就是属于这么一种“中断”,当用户按下按钮的时候,就产生一个“中断”,相当于产生一个信号,接着就会处理这么一个“中断任务”(程序里体验为调用一个函数)。


“信号”在GTK中可以认为一种中断的标志,如按下按钮的标志为"pressed",释放按钮的标志为"released",这些标志就相当于 C 语言的关键字一样,我们使用的时候必须完全按照它的名字来写。需要注意的是,每个控件的信号标志不一定都一样,如按钮(GtkButton)里有"pressed"信号,窗口(GtkWindow)里就没这个信号,每个控件具体有哪个信号,应该查看帮助文档来确定。


按钮的常用信号:

"clicked" : 单击按钮时触发

"pressed" : 按下按钮时触发

"released" : 释放按钮时触发


对于程序而言,我们按下按钮,是让其调用一个函数。假如有函数A, B, C,我们如何确定按下按钮后只调用函数A,而不是函数 B 或 C。这时候,我们需要一种规则规定,按下按钮后就调用函数A,就像交通规则一样,红灯停绿灯行,信号注册函数就是做这样的事情。


信号注册函数:

gulong g_signal_connect( 

gpointer instance,

const gchar *detailed_signal,

GCallback c_handler,

gpointer data );

instance:信号发出者,可以认为我们操作的控件,如按下按钮,这个就为按钮指针

detailed_signal:信号标志,如"pressed"

c_handler:回调函数的名称,需要用G_CALLBACK()进行转换

data:给回调函数传的参数,gpointer 相当于C语言的 void *

返回值:注册函数的标志


如:

g_signal_connect(button, "pressed",G_CALLBACK(callback), NULL);

当按下button按钮时,就会自动调用回调函数callback(相当于处理中断任务),回调函数callback可以是任意函数,函数名字我们根据需要自行命名,如果不是库函数,我们还得定义这个回调函数,这里需要注意的是,回调函数的写法(返回值,参数),不是我们想怎么写就怎么写,帮助文档里已经规定好了回调函数应该如何写,如果不按规定来写,可能产生意想不到的错误。


帮助文档的使用请点此处。


回调函数的定义:

void callback(GtkButton *button,gpointer data)

{

}


回调函数参数的含义:



相当于把g_signal_connect()的第一个参数传给回调函数的第一个参数,最后一个参数传给回调函数的最后一个参数。


接下来,我们做这么一个例子,按下按钮,把按钮上的文本信息打印到屏幕上。


设置容器与控件之间的间距:

void gtk_container_set_border_width(

GtkContainer *container,

guint border_width);

container:容器

border_width:容器与控件之间的间距,如下图,guint相当于C语言的uint



获取按钮上的文本内容:

const gchar *gtk_button_get_label(GtkButton *button);

button:按钮

返回值:获取到的文本内容


完整代码如下:

#include <gtk/gtk.h>
#include <stdio.h>

void deal_pressed(GtkButton *button, gpointer user_data)
{
        const char *text = gtk_button_get_label(button);

        printf("%s----%s\n",(char *)user_data, text );

        return;
}

int main(int argc, char *argv[])
{
        //1.gtk环境的初始化
        gtk_init(&argc, &argv);

        //2.创建一个窗口
        GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        //设置窗口边框与内部控件的间隔15
        gtk_container_set_border_width(GTK_CONTAINER(window), 15);

        //3.创建一个按钮button
        GtkWidget *button = gtk_button_new_with_label("button");
        //将button添加到window中
        gtk_container_add(GTK_CONTAINER(window), button);

        //4.创建一个按钮信号
        g_signal_connect(button, "pressed", G_CALLBACK( deal_pressed ), "haha, button");

        //5.显示所控件
        gtk_widget_show_all(window);

        //6.主事件循环
        gtk_main();

        return 0;
}

运行的结果:



源码下载:http://download.csdn.net/download/lianghe_work/8936277

转自:

  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值