g_signal_connect 与 g_signal_connect_swapped

摘要:
有所有构件都继承的信号,如"destroy",有构件专有的信号,如开关按钮发出的"toggled"信号。可以这样使用函数来设置连接:gulongg_signal_connect;第一个参数是要发出信号的构件,第二个参数是你想要连接的信号的名称,第三个参数是信号被捕获时所要调用的函数,第四个参数是你想传递给这个函数的数据。另一个在helloworld示例中使用的调用,是:gulongg_signal_connect_swapped;g_signal_connect_swapped()和g_signal_connect()相同,只是回调函数只用一个参数,一个指向GTK对象的指针。然而我们一般不用函数g_signal_connect_swapped()设置回调。
在 2.0 版,信号系统已从 GTK 移到 GLib,因此在函数和类型的说明中有前缀 "g_" 而不是 "gtk_"。我们不打算介绍 GLib 2.0 信号系统相对 GTK 1.2 信号系统扩展的细节。

在我们详细分析helloworld程序之前,我们会讨论信号和回调函数。GTK 是一个事件驱动的工具包,意味着它会等在 gtk_main() 那里,直到下一个事件发生,才把控制权传给适当的函数。

控制权的传递是使用“信号”的办法来完成的。(注意这里的信号并不等同于 Unix 系统里的信号,并且也不是用它们实现的,虽然使用的术语是一样的。) 当一个事件发生时,如按一下鼠标键,所按的构件会“发出”适当的信号。这就是 GTK 的工作机制。有所有构件都继承的信号,如 "destroy",有构件专有的信号,如开关 (toggle) 按钮发出的 "toggled" 信号。

要使一个按钮执行一个动作,我们需设置信号和信号处理函数之间的连接。可以这样使用函数来设置连接:

gulongg_signal_connect( gpointer *object,
const gchar *name,
GCallback func,
gpointer func_data );

第一个参数是要发出信号的构件,第二个参数是你想要连接的信号的名称,第三个参数是信号被捕获时所要调用的函数,第四个参数是你想传递给这个函数的数据。

第三个参数指定的函数叫做回调函数,一般为下面的形式:

void callback_func( GtkWidget *widget,
gpointer callback_data );

第一个参数是一个指向发出信号的构件的指针,第二个参数是一个指向数据的指针,就是上面g_signal_connect() 函数的最后一个参数传进来的数据。

注意上面回调函数的声明只是一般的形式,有些构件的特殊信号会用不同的调用参数。

另一个在helloworld示例中使用的调用,是:

gulongg_signal_connect_swapped( gpointer *object,
const gchar *name,
GCallback func,
gpointer *slot_object );

g_signal_connect_swapped() 和g_signal_connect() 相同,只是回调函数只用一个参数,一个指向 GTK 对象的指针。所以当使用这个函数连接信号时,回调函数应该是这样的形式

void callback_func( GtkObject *object );

这个对象通常是一个构件。然而我们一般不用函数g_signal_connect_swapped() 设置回调。它们常用来调用一个只接受一个单独的构件或者对象作为参数的 GTK 函数,如同我们的helloworld示例中那样。

拥有两个函数来设置信号连接的目的只是为了允许回调函数有不同数目的参数。GTK 库中许多函数仅接受一个单独的构件指针作为其参数,所以对于这些函数你要用g_signal_connect_swapped(),然而对你自己定义的函数,你可能需要附加的数据提供给你的回调函数。

免责声明:文章转载自《g_signal_connect 与 g_signal_connect_swapped》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇得到控制台窗口的句柄tensorflow中的学习率调整策略下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

将Delphi的对象方法设为回调函数

心血来潮,为了实现更好的通用性和封装性,需要把类方法作为回调函数,搜得一篇好文,节选转发。命名似乎应该是MethodToCallback才合适,可惜调试时总是报错,debugging。 原文地址:http://blog.csdn.net/linzhengqun/article/details/1451088 Win32的API有一些需要回调函数,说白...

回调函数在小程序中的实际应用

需求分析 1.小程序主页/index/index.js初加载时需要从服务器请求数据 2.请求功能封装在utils/util.js里面,在主页的onLoad里面调用 问题 1.由于在util.js中的请求是异步方式,返回时间不确定,导致onLoad的时候取不到值 // miniprogram/pages/index/index.js import {getD...

Linux内核笔记:epoll实现原理(一)

一、说明 针对的内核版本为4.4.10。 本文只是我自己看源码的简单笔记,如果想了解epoll的实现,强烈推荐下面的文章: The Implementation of epoll(1) The Implementation of epoll(2) The Implementation of epoll(3) The Implementation of ep...

C#开发BIMFACE系列37 网页集成开发1:审图系统中加载模型或图纸

系列目录 【已更新最新开发文章,点击查看详细】 在之前的《C#开发BIMFACE系列》中主要介绍了BIMFACE平台提供的服务端API接口的封装开发与测试过程。 服务端API测试通过后,需要根据具体业务的需求集成到管理系统中,配合BIMFACE提供的前端JavaScript API的使用可以很轻松的集成到网页中实现模型/图纸的加载、浏览、批注对比等功能。...

libcurl教程

名称 libcurl 的编程教程 目标 本文档介绍使用libcurl编程的一般原则和一些基本方法。本文主要是介绍 c 语言的调用接口,同时也可能很好的适用于其他类 c 语言的接口。 跨平台的可移植代码 libcurl库背后的开发人员投入了相当大的努力确保libcurl可以在很多不同的系统和环境里工作。 全局的准备 程序必须初始化一些libcurl的全局函数...

libusb函数

一、libusb常用数据结构 libusb_device *list:设备列表 libusb_device_handle *handle:设备句柄 struct libusb_device_descriptor desc:设备描述符 struct libusb_config_descriptor conf:配置描述符 二、libusb常用API函数 1...