首页 > 其他分享 >GTK入门学习:信号与回调函数

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

时间:2022-09-28 21:47:18浏览次数:59  
标签:gtk 入门 button GTK pressed 信号 按钮 函数


前面我们学习的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)


{



}


回调函数参数的含义:

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


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


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


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

void gtk_container_set_border_width(

GtkContainer *container,

guint border_width);

container:容器

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

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


获取按钮上的文本内容:

const gchar *gtk_button_get_label(GtkButton *button);

button:按钮

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


完整代码如下:


#include <gtk/gtk.h>  // 头文件

// 按钮按下的处理函数, gpointer 相当于 void *
void deal_pressed(GtkButton *button, gpointer user_data)
{
// button指向main函数的button
// user_data 指向main函数的"I am a button"
// 获得按钮的文本信息
const char *text = gtk_button_get_label( button );
printf("%s ========= %s\n", (char *)user_data, text); // 打印内容
}

int main( int argc,char *argv[] )
{
gtk_init(&argc, &argv); // 初始化

GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL); // 创建顶层窗口
// 设置窗口边框的宽度(窗口里的控件与窗口边框间隔为15)
gtk_container_set_border_width(GTK_CONTAINER(window), 15);


GtkWidget *button = gtk_button_new_with_label("^_^"); // 创建按钮
gtk_container_add(GTK_CONTAINER(window), button);// 把按钮放入窗口(窗口也是一种容器)

/* 按钮按下(pressed)后会自动调用deal_pressed()
* "I am a button"是传给回调函数deal_pressed()的参数
*/
g_signal_connect(button, "pressed", G_CALLBACK(deal_pressed), "I am a button");

gtk_widget_show_all(window); // 显示窗口全部控件

gtk_main(); // 主事件循环

return 0;
}



标签:gtk,入门,button,GTK,pressed,信号,按钮,函数
From: https://blog.51cto.com/u_3002289/5720923

相关文章

  • C语言入门学习——函数的使用
    函数的概述C程序是由函数组成的,我们写的代码都是由主函数main()开始执行的。函数是C程序的基本模块,是用于完成特定任务的程序代码单元。从函数定义的角度看,函数可分为系......
  • GTK进阶学习:键盘事件
    键盘事件,可以理解为操作键盘的动作。对于窗口而言,用户操作键盘,窗口检测到键盘的操作(产生一个信号),然后去做相应处理(调用其规定的回调函数),即可认为是键盘事件,还是信号......
  • 反射快速入门
    创建Cat模型packagecom.reflection.domain;publicclassCat{privateStringname="小喵";publicvoidhi(){System.out.println("hi"+nam......
  • Python入门基础
    今日内容总结while循环的补充说明流程控制之for循环while循环什么是循环,循环就是想要让一些代码反复执行while条件:条件成立后所执行的循环体代码 1.先判断条......
  • Go语言图形界面开发:Go版GTK
    初识GTK​​01、GUI概述​​​​02、GTK简介​​​​03、环境搭建(windows)​​Go语言快速入门​​04、Go入门教程​​HelloGTK​​05、一个简单的空白窗口​​​​06、控......
  • C语言也能做界面:踏上GTK+学习之旅
    ​​00、背上行囊1——程序员学习之道​​​​01、背上行囊2——为什么要学习GTK​​​​02、背上行囊3——​​​​GUI概述​​​​03、背上行囊4——GTK简介​​​​04、......
  • JS中面向对象编程(OOP)的基本原理——this关键字、原型链、构造函数、继承
    面向对象编程(ObjectOrientedProgramming),是软件开发过程的主要方法之一。在OOP中,使用对象和类组织代码来描述事物及其功能。虽然点符号是访问对象属性的有效方法(如myobj.......
  • protobuf入门教程
    ​​1、简介和安装​​​​2、消息类型​​​​3、proto3与proto2的区别​​​​4、常用序列化/反序列化接口​​​​5、repeated限定修饰符​​​​6、枚举(enum)、包(pa......
  • Go入门教程
    基础编程​​01、Go语言介绍​​​​02、环境搭建​​​​03、第一个Go程序​​​​04、命名、变量、常量​​​​05、基础数据类型​​​​06、格式化输出、类型转换、类型......
  • protobuf入门教程(五):枚举(enum)、包(package)
    枚举(enum)消息格式当需要定义一个消息类型的时候,可能想为一个字段指定某“预定义值序列”中的一个值,这时候可以通过枚举实现。syntax="proto3";//指定版本信息,不指定会报......