QT事件与信号之间的关系

前言:事件是操作系统时,一种触发操作后的结果。 事件产生,大部分由硬件进行触发。如(鼠标的移动、按压、双击。键盘的键入等)。小部分由软件触发(如应用程序内容发送事件类型给操作系统执行相应功能)

一、触发事件流程

硬件触发事件流程: 硬件做出动作->发送给操作系统->将点击的信息发送给程序中的对象->对象开始做业务处理。

 换做为键盘后,处理流程实际上是一样的,只是执行的业务动作的对象变更而已,如下

 二、QT中事件的处理

在QT里的操作事件,是需要运用到多态来实现的,以鼠标QMouseEvent事件为例:

可以看到鼠标事件类的基类为QInputEvent

也就是说,当鼠标进行操作时,会有一个【事件】的产生,也会生成一个【事件对象】,同时操作【事件处理函数】来处理我们的动作。 如下:

 

 举个例子,若我们在【鼠标事件】中重写父类的【事件处理函数】,那么我们的【每一个鼠标事件】对象都会执行我们【重写的事件处理函数】。如下:

 理解了后,可能有些小伙伴会想,在我们操作时系统又如何判定我们发送的事件类型,从而调用对应事件处理函数呢?

如下: 函数QObject::event(QEvent *e)

而上面这个函数,参数就是操作系统给与的事件类型(移动鼠标、键盘键入内容),就是处理当我们去进行触发事件时,虽然看起来没有内容激活,但其内部是一直在判断我们的事件类型,如鼠标移动则为移动事件产生,但其处理函数为空返回信息。所以我们看来没有任何操作。

但如果说我们进行了鼠标点击,此时的事件就会进入鼠标按压事件并进行相应的处理函数,也就会执行相应的动作。

简单来说,整个流程是用户端操作->事件触发->事件分发->事件处理函数分发->处理反馈信息至用户端。

------------------------------------------------------我是分割线------------------------------------------------------------

三、事件与信号的关系

结论:事件是先于信号产生的,有事件不一定有信号,有信号一定有事件。

举个例子说明:

我们知道在QT中的标签Label是没有鼠标点击信号的,但Label本身却存在鼠标点击事件,即QMouseEvent;

但标签(label)本身用鼠标进行点击时,会有一个鼠标按压事件mouse press event,而这个事件产生后的事件执行函数是一个空内容,所以我们没有办法看到任何效果。

但如果我们创造一个新类,将Label本身进行继承,初始化后针对标签的按压事件的执行函数进行改写,使其事件执行函数变为我们自定义的信号,如下:

 当这个时候,我们再去widget操作编辑框点击时,就可以通过鼠标事件的按压,从而调用QLabel里面添加的新信号clicked(),再执行对应槽函数即可。

 最终效果,点击哪个标签,哪里就有图片

 

 ----------------------------------------------我是分割线-----------------------------------------------------------------

总结:事件在我们打开电脑后,无时无刻都在执行,而信号是由事件引导,存在于事件分发的事件函数中进行激活,从而引导至槽函数进行功能执行。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值