前言:事件是操作系统时,一种触发操作后的结果。 事件产生,大部分由硬件进行触发。如(鼠标的移动、按压、双击。键盘的键入等)。小部分由软件触发(如应用程序内容发送事件类型给操作系统执行相应功能)
一、触发事件流程
硬件触发事件流程: 硬件做出动作->发送给操作系统->将点击的信息发送给程序中的对象->对象开始做业务处理。
换做为键盘后,处理流程实际上是一样的,只是执行的业务动作的对象变更而已,如下
二、QT中事件的处理
在QT里的操作事件,是需要运用到多态来实现的,以鼠标QMouseEvent事件为例:
可以看到鼠标事件类的基类为QInputEvent
也就是说,当鼠标进行操作时,会有一个【事件】的产生,也会生成一个【事件对象】,同时操作【事件处理函数】来处理我们的动作。 如下:
举个例子,若我们在【鼠标事件】中重写父类的【事件处理函数】,那么我们的【每一个鼠标事件】对象都会执行我们【重写的事件处理函数】。如下:
理解了后,可能有些小伙伴会想,在我们操作时系统又如何判定我们发送的事件类型,从而调用对应事件处理函数呢?
如下: 函数QObject::event(QEvent *e)
而上面这个函数,参数就是操作系统给与的事件类型(移动鼠标、键盘键入内容),就是处理当我们去进行触发事件时,虽然看起来没有内容激活,但其内部是一直在判断我们的事件类型,如鼠标移动则为移动事件产生,但其处理函数为空返回信息。所以我们看来没有任何操作。
但如果说我们进行了鼠标点击,此时的事件就会进入鼠标按压事件并进行相应的处理函数,也就会执行相应的动作。
简单来说,整个流程是用户端操作->事件触发->事件分发->事件处理函数分发->处理反馈信息至用户端。
------------------------------------------------------我是分割线------------------------------------------------------------
三、事件与信号的关系
结论:事件是先于信号产生的,有事件不一定有信号,有信号一定有事件。
举个例子说明:
我们知道在QT中的标签Label是没有鼠标点击信号的,但Label本身却存在鼠标点击事件,即QMouseEvent;
但标签(label)本身用鼠标进行点击时,会有一个鼠标按压事件mouse press event,而这个事件产生后的事件执行函数是一个空内容,所以我们没有办法看到任何效果。
但如果我们创造一个新类,将Label本身进行继承,初始化后针对标签的按压事件的执行函数进行改写,使其事件执行函数变为我们自定义的信号,如下:
当这个时候,我们再去widget操作编辑框点击时,就可以通过鼠标事件的按压,从而调用QLabel里面添加的新信号clicked(),再执行对应槽函数即可。
最终效果,点击哪个标签,哪里就有图片
----------------------------------------------我是分割线-----------------------------------------------------------------
总结:事件在我们打开电脑后,无时无刻都在执行,而信号是由事件引导,存在于事件分发的事件函数中进行激活,从而引导至槽函数进行功能执行。