QT3:QT的事件机制

QT3:QT的事件机制

(1)事件机制简介:

            操作系统将获取的事件,比如鼠标按键,键盘按键的keyPressEvent, mouseReleaseEvent等事件,放入系统的消息队列中, Qt事件循环的时候读取消息队列中的消息,转化为QEvent并被分发到相应的QWidget对象,相应的 QWidget中的event会根据事件类型调用不同的事件处理函数,在事件处理函数中发送QT预定义的信号,最终调用信号关联的槽函数。

            事件由输入设备(鼠标、键盘)产生,由QObject类接收和处理,由QApplication或QCoreApllication负责发送。

 

(2)事件的分类:

           1) Spontaneous事件 ---------自发事件:

                       由窗口系统产生,它们被放到系统队列中,通过事件循环逐个处理。

           2) Posted事件:

                       由Qt或是应用程序产生,它们被Qt组成队列,再通过事件循环处理。

           3) Sent事件:

                        由Qt或是应用程序产生,但它们被直接发送到目标对象。

 

(3)信号与事件的区别:

          1)事件由具体的QWidget对象进行处理,信号则由具体的QWidget对象生成。

          2)改写事件处理函数可能会导致程序行为发生改变,信号是否存在对应的槽函数不会改变程序的行为。

          3)通常,信号在具体的事件处理函数中产生。

 

(4)事件过滤器:

         1)事件过滤器是Qt中一个独特的事件处理机制,通过事件过滤器,可以让一个对象监控另外一个(多个)对象的事件。

         2)事件过滤器实现如下:

                    在所有Qt对象的基类QObject中有一个类型为QObjectList的名为eventFilters成员变量。

                    当某个QObject(A)给另一个QObject(B)安装了事件过滤器后, B会把A的指针保存在eventFilters中。

                    在B处理事件前,会先去检查eventFilters列表,如果非空,就先调用列表中对象的eventFilter0函数。

                   一个对象可以给多个对象安装过滤器,一个对象能同时被安装多个过滤器,在事件到达之后,事件过滤器以安装次序的反序被调用。

                    事件过滤器函数eventFilter0返回值是bool型,如果返回true,则表示事件已经被处理完毕, Qt将直接返回,进行下一事件的处理;如果返回false,事件将接着被送往剩下的事件过滤器或是目标对象进行处理。

 

(5)事件与信号的区别:

              1)信号是较为高级的机制,事件是较为低级的机制。一般情况下,事件来自底层窗口系统,但是也有可能通过QApplication类的QApplication::sendEvent0和QApplication::postEvent来手动发送事件。

              2)都可以用于跨线程环境,信号-槽要采用“队列连接"或"自动连接(默认)"方式,不能采用"直接连接 (类似回调) 。

              3)使用信号-槽机制与事件机制的一个根本原则是,在使用一个组件时,使用信号;在实现一个组件时,使用事件机制。原因是:事件机制是更为底层的机制(也就是某些情况下没有相应信号可以接收) ,例如鼠标在组件上的划过,按下和抬起,在处理这类事件时,可以决定何时发出类似clicked)的信号。

              4)优先级:信号槽中,信号触发多个槽是没有固定顺序的,会全部触发。(观察者模式)事件触发的多个处理者是有固定的顺序的,优先级高的决定是否把事件继续传递下去(通过返回值)。

              5)返回值:事件处理函数的返回值是有意义的,我们要根据这个返回值来确定是否还要继续事件的处理,比如在QT中事件处理函数如果返回true,则这个事件处理已完成, QApplication会接着处理下一个事件,而如果返回false,那么事件分派函数会继续向上寻找下一个可以处理该事件的注册方法。

                信号处理函数的返回值对信号分派器来说是无意义的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值