在 2.0 版,信号系统已从 GTK 移到 GLib,因此在函数和类型的说明中有前缀 "g_" 而不是 "gtk_"。我们不打算介绍 GLib 2.0 信号系统相对 GTK 1.2 信号系统扩展的细节。

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

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

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

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

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

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

void callback_func( GtkWidget *widget,
gpointer callback_data );

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

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

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

gulong g_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相关推荐

  1. GTK中g_signal_connect与g_signal_connect_swapped的区别

    g_signal_connect: gulong g_signal_connect( gpointer *object,const gchar *name,GCallback func,gpointe ...

  2. g_signal_connect_swapped与g_sign…

    http://blog.sina.com.cn/s/blog_7d49c1800101fdar.html 在上一个实例中,由于笔误,不小心发现了g_signal_connect_swapped()与g ...

  3. g_signal_connect_swapped的作用是什么?

    `g_signal_connect_swapped(instance, detailed_signal, c_handler, data);` connects a GCallback functio ...

  4. Gstreamer应用g_signal_new/g_signal_connect/g_signal_emit总结(十二)

     众所周知,Microsoft's Windows和Apple's MacOS对多媒体设备.多媒体创作.播放和实时处理等方面都有很好的支持,而Linux对多媒体应用一直略显不足,所以为了解决Linux ...

  5. GTK+重拾--08 GTK+中的对话框

    版权声明:您好,转载请留下本人博客的地址,谢谢 https://blog.csdn.net/hongbochen1223/article/details/50351564 (一):写在前面 在这一个小 ...

  6. Gtk+2 Hello World:从源码到打包发布

    Gtk+2 Hello World:从源码到打包发布 1.创建源代码 [zechen11@Arch ~]$ mkdir hello[zechen11@Arch ~]$ cd hello[zechen1 ...

  7. C指针原理(26)-gtk

    下面演示了如何在窗口中增加一个按钮,示例代码均有注释 #include <gtk/gtk.h>static void print_hello (GtkWidget *widget,gpoi ...

  8. C指针原理(25)-gtk

    GTK+3开发 GTK+3可以运行在WIN下和LINUX下. #include <gtk/gtk.h>int main( int argc, char *argv[]) {GtkWidge ...

  9. gtk学习总结:GTK从入门到放弃,三天包教包会

    今天花了一些时间复习之前学习过的gtk,感觉东西光学不用忘得好快啊,在这做个之前学过的内容的备份,希望对大家有用,也希望大家不要从入门到放弃.文中有些代码例子可能来自<GTK从入门到精通> ...

最新文章

  1. Windows Phone 7 不温不火学习之《创建用户控件》
  2. HDU2066(SPFA算法)
  3. Populating Next Right Pointers in Each Node II
  4. 接口方法和映射器的statement id 是怎么绑定起来的?
  5. 13种重要的云原生工具,让交付过程更快
  6. 电子工程可以报考二建_二建报考要求是工程类专业怎么办?非工程类专业可以报名吗?...
  7. Linux Qt工程组织结构与动态库引用
  8. 高级shell编程讲解
  9. Idea设置背景色设置为护眼色
  10. 斜齿轮重合度计算公式_斜齿齿轮传动中重合度计算的探讨
  11. 微信扫码点餐帮助商家赚钱的方法
  12. MGMT_VIEW 用户的功能与作用
  13. 近期活动盘点:个人消费信贷与风险控制讲座、清华大学教育大数据论坛
  14. Optimization Week 5: Duality example
  15. TLC5615模数转换锯齿波仿真实验(Arduino)
  16. 怎样在微信、手机中浏览查看3D模型
  17. Python——自动签到脚本
  18. 裁判文书网数据采集爬虫记录2023-03
  19. Ubuntu1604报错统一解决方法E: 无法获得锁 /var/lib/apt/lists/lock - open (11: 资源暂时不可用)
  20. 2018年吉林大学软件学院软件工程学硕复试回忆

热门文章

  1. GAN Guides
  2. 开发那些事儿:Linux系统中如何安装离线版本MySQL?
  3. 铝合金三扇推拉窗的计算机方法,13种铝合金门窗下料尺寸及计算公式收藏备用!...
  4. 带有Docker的容器
  5. apache通过.htaccess(rewrite)判断手机电脑跳转-手机用户重定向到手机版
  6. 斗鱼坎坷上市路,未来的对手不仅仅只有虎牙
  7. Linux(ubuntu) nmon系统资源监控工具
  8. python进度条箭头
  9. 微信公众号Java接入demo
  10. android传输大图片,Android中 Activity传递图片