• Qt事件系统基本概念


    (转自:http://www.cnblogs.com/andy1987/p/3322059.html)

    1. QT事件系统

        Qt应用程序的消息处理是基于事件驱动的,程序的每个动作都是由某个事件所触发的,例如:鼠标动作触发QMouseEvent,键盘操作触发QKeyEvent等,所有这些事件都派生于QEvent,具体事件的路由是通过QObject::event()来实现的。

        事件一般被划分为两类

        1) 系统事件,比如鼠标,键盘的操作,这些事件由系统捕获然后被插队到系统消息队列中,Qt应用程序通过事件循环从系统消息中读取消息(事件)然后用QEvent进行消息(事件)封装,接下来就是对QEvent的依次处理了.

        2) 自发事件,主要由QT程序自己产生,然后通过postEvent或者sendEvent将事件发送到目标对象上或者消息队列中,类似VC中自定义事件,通过PoseMessage和SendMessage进行消息的发送。 在QT系统中通过postEvent传递的事件将被送入到消息队列中,然后由消息循环读取消息,一次处理,通过sendEvent发送的事件将直接被发送到目标对象执行,不要进行事件的排队处理.

       Qt系统定义的事件类型比较多,像我们常用的有:

       键盘事件(Press/release) , 鼠标事件(press,release,move,double click等),拖放事件(drag ,drop) , 绘屏事件(paint),焦点事件(focus),大小改变事件(resize)等等

      每个事件类型都有对应的事件类对该事件相关联的的信息进行封装,例如鼠标事件QMouseEvent,该类记录了当前鼠标的位置以及以及鼠标按键的信息, 键盘事件QKeyPressEvent类记录了按下键信息.


    2.事件的发送

     在1在提到程序自发类型事件时候,我们说过posetEvent和sendEvent,该两个方法就是应用于QT系统中事件的发送。

     sendEvent方法是直接将是直接将事件发送到目标对象上的,所以当目标收到事件后是直接执行的。

     postEvent方法并不是直接投递事件到对象上,而是通过将事件投递到消息队列中,然后由消息循环从队列中读取事件,依次处理的 。


    3.事件的处理

     在Qt中对事件的处理有很多种方式

     1) 直接有对应事件处理方法进行处理,例如:鼠标移动事件有mouseMoveEvent处理,键盘按下事件由keyPressEvent处理,每个事件都有特定的方法用于处理该事件.

     2)  event()处理,在QT系统中事件的处理都是通过event()进行分发的,所以在事件落实到具体的对象和特定的方法时候,都是要通过event(),所以如果要拦截某个消息可以通过重载event实现

    3) notify()处理,notify用于事件的过滤和合并,最后实现事件的分布,有点类似event()

    4)事件过滤,事件过滤的主要是用于在事件被投递到特定的处理方法时候,捕获事件,并作相应处理,事件过滤也实现让一个对象可以对另一个对象事件的监控,并在事件被处理前进行预处理操作.

  • 相关阅读:
    如何阅读一个Web项目 【转载】
    线程的状态与基本操作
    java多线程通信方式之一:wait/notify
    synchronized的简单理解
    每月IT摘录201807
    springmvc 请求无法到达controller,出现404
    android开发 java与c# 兼容AES加密
    android 开发不能创建目录
    mysql存储过程出现OUT or INOUT argument 10 for routine
    android退出登陆后,清空之前所有的activity,进入登陆主界面
  • 原文地址:https://www.cnblogs.com/FindSelf/p/3712063.html
Copyright © 2020-2023  润新知