GTK应用程序是基于事件触发机制的。

我们使用g_signal_connect()将事件和对事件的处理函数(回调函数)联系在一起。
但是有时候是信号处理函数,有时候又说事件处理函数,都把人弄晕了。

事件的叫法是比较底层的说法,当我们按了一个按钮,在GDK层看来就是一个事件发生了,所谓的GDKEvent;当然事件还有一个更低层的说法,就是X事件。

按下按钮,Xserver发出事件消息,GDK层收到后发出GDKEvent给GTK,

GTK收到这个GDKEvent后,将GDK事件关联到Gtk自身定义的信号上,并将信号发出。

一层层推进:X事件->GDKEvent->信号

其实可以从网络协议理解,收到http报文的同时,肯定会收到tcp报文和ip报文啦。

GTK本身就是建立在GDK库和Xlib的基础上的。

再多扯一下,信号比较高级的,事件是比较低级的,在没有GTK库的时候,我们可以只用GDK进行编程,那时候就是处理事件了,但是会编程会变得复杂。

那么我们再来具体看看,事件回调函数和信号回调函数的差异

首先,使用g_signal_connect()可以将回调函数和相关的信号/事件联系起来

但是,这两者的回调函数在书写的时候是不一样的,

信号回调函数,属于GTK层,抽象级别较高,比较简单

void calback_func(GtkWidget *widget,gpointer callback_data)

信号回调函数中的两个参数的作用在于,但该函数执行时,通过他们可以知道外界的信息,比如是哪个构件发的信号,导致该函数被叫出来跑,或者跑的时候需要事先交代点什么data。毕竟对于信号回调函数自己来说,它可能在g_signal_connect的安排下,因为多个不同构件收到多个不同信号,就被叫出来了。

那么事件回调函数呢,属于GDK层,相比较与信号回调函数的参数多了一个,另外返回值也起作用。

gboolean callback_func(GtkWidget *widget,GdkEvent *event,gpointer callback_data);

关于返回值

返回值,如果是TRUE的话,说明事件已经处理完了,不用再进一步传播了(在GDK层解决问题),比如说不用发信号告诉他人了(转移到GTK层)。

返回值,如果是FALSE的话,继续处理。

关于返回值的意思,思考下“delete_event”事件和“destroy”信号

当我们点击窗口的X按钮(记住只是点击,不代表已经关了,能不能关还要看我们怎么处理该事件),GDK层发出“delete_event”事件的通知,我们去捕获该事件,对其处理,编写delete_event事件回调函数,在函数中直接调用gtk_main_quit();(这样非常坑爹,因为GDK只是告诉你有人点击关闭了,你二话不说,直接终止gtk_main()),当然这样的做法,确实是可以达到关闭窗口的同时结束进程的效果。因为连gtk_main()都结束了,还谈什么后续处理,直接整个窗口关闭,结束战斗。

但是如果我们想要,点击关闭按钮然后一直都关不掉呢?

编写delete_event事件回调函数,在函数中什么也不做,返回TRUE。这么做,等于说,当用户点击关闭窗口时,GDK提醒你这个事件,然后你去处理,可是坑爹的是,你什么也不做,然后还告诉GDK这个事啊我已经办妥了(返回TRUE)。结果是,用户不停地点击关闭按钮,却发现什么事也没有,这个行为比上一行为更加坑爹。

正常的做法呢,收到“delete_event”,我们去执行关闭窗口并返回FALSE,GTK发出“destroy”信号(此时窗口已关闭),destroy处理函数,执行gtk_main_quit();

默认行为时怎样的呢?如果我们不处理“delete_event”事件,GDK会默默关掉窗口(这个就是上面的“正常的做法”),然互GTK发出“destroy”,GTK告诉进程我们的窗口让人给关了,此时进程还在gtk_main()里,如果这个时候进程说不管它,什么处理也没有,那么就是常见的窗口已关,进程仍在。

所以说呢 ,一般编程中,处理“destroy”信号就行了,窗口都让人关了,对于一个GUI程序来说,还有多少活着的意义,直接gtk_main_quit();

gtk_widget_set_events ()
void  gtk_widget_set_events (GtkWidget *widget,  gint events);
Sets the event mask (see GdkEventMask) for a widget. The event mask determines which events a widget will receive. Keep in mind that different widgets have different default event masks, and by changing the event mask you may disrupt a widget's functionality, so be careful. This function must be called while a widget is unrealized. Consider gtk_widget_add_events() for widgets that are already realized, or if you want to preserve the existing event mask. This function can't be used with GTK_NO_WINDOW widgets; to get events on those widgets, place them inside a GtkEventBox and receive events on the event box.

GTK GDK 事件 信号相关推荐

  1. linux gtk python,python-Linux上具有pygtk(gtk.gdk)的桌面/根窗口上的键盘/鼠标事件

    如标题所示,我正在尝试使用Python-gtk捕获Mouse和Keyboard事件. 我可以使用python-xlib轻松做到这一点: self.display = display.Display() ...

  2. C++使用事件信号SetEventt和ResetEvent实现线程同步

    #include <Windows.h> #include <iostream> using namespace std;HANDLE gEvent; DWORD WINAPI ...

  3. QTableView操作 双击 单机事件信号

    双击QTableView的行,获取该行数据 代码如下,请注意参数类型匹配 connect(dataTabView_, SIGNAL(doubleClicked(const QModelIndex &a ...

  4. QTableView双击 单机事件信号

    双击QTableView的行,获取该行数据 代码如下,请注意参数类型匹配 connect(dataTabView_, SIGNAL(doubleClicked(const QModelIndex &a ...

  5. GTK之信号和回调函数

    GTK之信号和回调函数   在 2.0 版,信号系统已从 GTK 移到 GLib,因此在函数和类型的说明中有前缀 "g_" 而不是 "gtk_".   GTK ...

  6. 【GTK】信号量(signal)大全

    信号函数: gint gtk_signal_connect(GtkObject *object,gchar *name,GtkSignalFuncfunc,gpointer func_data); 回 ...

  7. 使用GTK+和Glade快速开发Linux图形界面

    * 使用 GTK+ 和 Glade 快速开发 Linux 图形界面 ** GTK+ 简介 *** 基本概念 GTK+ 是一种用于创建图形界面的库. 嗯, gnome 用的就是它, 不过并不是说只 有在 ...

  8. C语言基于GTK+Libvlc实现的简易视频播放器(二)

    简易视频播放器-全屏播放 一.课程说明 上一次我们使用gtk+libvlc实现了一个最简单的视频播放器,可以实现点击按钮暂定和停止播放视频,以及同步显示视频播放进度,但即使作为一个视频播放器,只有这些 ...

  9. python gui button回调函数运行完成后弹出窗口_嵌入式设备GUI开发之GTK+入门(一)...

    小伙伴们大家好,最近鑫哥带领大家做了很多的C语言的小项目,那有些小伙伴说我们可以用python做图形界面,我们可以使用C语言做吗? 我的回答是当然没问题嘻嘻,接下来鑫哥就带大家一起去看看如何进行GTK ...

  10. GTK+图形化应用程序开发学习笔记(三)—窗体

    一.初始化GTK+ 写GTK+程序需要调用gtk_init函数对GTK+库函数进行初始化. 1. 名称:: gtk_init 功能: 初始化GTK+库 头文件: #include <gtk/gt ...

最新文章

  1. nyoj905 卡片游戏
  2. 一步一步asp.net_三层构架的学习
  3. java 二维数组作为参数传递_java JNI 二维数组作为方法参数传递给本地
  4. couchbase java 手册_couchbase的使用 java
  5. maya python插件_Maya中Python代码插件编译技术视频教程
  6. Windows下使用Git配置SSH免密登录
  7. hdu3351 stack
  8. C/S系统实现两数求和(非阻塞+epoll+心跳包检测用户在线状况+滚动日志+配置文件.)...
  9. 大牛总结的 Git 使用技巧,写得太好了!
  10. 第11周学习进度情况
  11. visio2010安装
  12. Java实现简单模拟购物程序
  13. led伏安特性实验误差分析_大学物理实验伏安特性曲线的误差分析以及小结要怎么写,谢谢^ω^...
  14. 洛谷在线测试P1878_舞蹈课
  15. 鼠标画上去图片旋转360度
  16. 卡内基·梅隆大学计算机科学系主任周以真的父母是中国人吗,清华大学计算机科学与技术系...
  17. C++基础继承和多态(水上飞机)
  18. I DEA出现Spring配置错误:class path resource [.xml] cannot be opened because it does not exist
  19. Camera360 一款强大的手机拍照必备软件
  20. CSS3 3D transform

热门文章

  1. [转载]刘光斗-刘晚苍系武学传人概况
  2. Win系统使用WSL子系统Linux启动vGPU增强图形性能加速OpenGL
  3. python禅语_但行好事,莫问前程,如何理解?
  4. 乱码原因产生和解决方案
  5. 桌面PDF文件名太长无法删除的问题
  6. 软件测试好学吗?前期比较容易,后期有一定难度
  7. 三角形周长最短问题_三角形周长最短的动点问题
  8. RDLC报表中使用自定义函数
  9. form 表单提交后,使页面不跳转
  10. Class6-Image Segmentation