(转自: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)事件过滤,事件过滤的主要是用于在事件被投递到特定的处理方法时候,捕获事件,并作相应处理,事件过滤也实现让一个对象可以对另一个对象事件的监控,并在事件被处理前进行预处理操作.

Qt事件系统基本概念的更多相关文章

  1. Qt 事件系统浅析 (用 Windows API 描述,分析了QCoreApplication::exec()和QEventLoop::exec的源码)(比起新号槽,事件机制是更高级的抽象,拥有更多特性,比如 accept/ignore,filter,还是实现状态机等高级 API 的基础)

    事件系统在 Qt 中扮演了十分重要的角色,不仅 GUI 的方方面面需要使用到事件系统,Signals/Slots 技术也离不开事件系统(多线程间).我们本文中暂且不描述 GUI 中的一些特殊情况,来说 ...

  2. Qt事件系统之五:事件过滤器和事件的发送

    Qt提供了事件过滤器来实现在一个部件中监控其他多个部件的事件.事件过滤器与其他部件不同,它不是一个类,只是由两个函数组成的一种操作,用来完成一个部件对其他部件的事件的监视.这两个函数分别是 insta ...

  3. Qt事件系统之四:定时器事件与随机数

    一.定时器事件和随机数 QTimerEvent类用来描述一个定时器事件.对于一个QObject的子类,只需要使用int QObject::startTimer ( int interval)函数来开启 ...

  4. Qt事件系统之三:键盘事件

    QKeyEvent类用来描述一个键盘事件.当键盘按键被按下或者被释放时,键盘事件便会被发送给拥有键盘输人焦点的部件. QKeyEvent的key()函数可以获取具体的按键,对于Qt中给定的所有按键,可 ...

  5. Qt事件系统之二:鼠标事件和滚轮事件

    在Qt中,事件作为一个对象,继承自 QEvent 类,常见的有键盘事件 QKeyEvent.鼠标事件 QMouseEvent 和定时器事件 QTimerEvent 等,与 QEvent 类的继承关系图 ...

  6. Qt事件系统之一:Qt中的事件处理与传递

    一.简介 在Qt中,事件作为一个对象,继承自 QEvent 类,常见的有键盘事件 QKeyEvent.鼠标事件 QMouseEvent 和定时器事件 QTimerEvent 等,与 QEvent 类的 ...

  7. 用ISO C++实现自己的信号槽(Qt另类学习)

    qtc++objectsignalclassstring   目录(?)[-] Qt信号与槽 引入元对象系统 建立信号槽链接 信号的激活 槽的调用 全家福 零零散散写在后面 Q_OBJECT Conn ...

  8. Qt经典—线程、事件与Qobject(耳目一新)

    介绍 You’re doing it wrong. — Bradley T. Hughes 线程是qt channel里最流行的讨论话题之一.许多人加入了讨论并询问如何解决他们在运行跨线程编程时所遇到 ...

  9. 转: Qt信号槽实现原理 清晰明了

    转: https://blog.csdn.net/perfectguyipeng/article/details/78082360 本文使用 ISO C++ 一步一步实现了一个极度简化的信号与槽的系统 ...

随机推荐

  1. 内置模块(time、random、hashlib、os)

    简介: 模块:本质上就是一个.py文件,使用其中的函数. 模块分为:内置函数.第三方模块.自定义模块. 今天学习的就是Python的内置函数. 回到顶部 一.time模块 1.时间的表示形式 在Pyt ...

  2. SIP穿越NAT SIP穿越防火墙-SBC

    FireWall&NAT FireWall是一种被动网络安全防卫技术,位于网络的边界.在两个网络之间运行訪问控制策略.防止外部网络对内部信息资源的非法訪问,也能够阻止特定信息从内部网络被非法输 ...

  3. MySQL之存储引擎(Day39)

    一 什么是存储引擎 mysql中建立的库=====>文件夹 库中建立的表=====>文件 现实生活中我们用来存储数据的文件应该有不同的类型:比如存文本用txt类型,存表格用excel,存图 ...

  4. vim批量注释与取消批量注释(转)

    方法一 块选择模式 插入注释: 用v进入virtual(可视化)模式(可以省略这一步) 用上下键选中需要注释的行数 按ctrl+v进入可视化块模式 按大写I进入插入模式,输入注释符‘#’或者是‘//’ ...

  5. uva 11752 The Super Powers (数论+枚举)

    题意:找出1~2^64-1中 能写成至少两个数的幂形式的数,再按顺序输出 分析:只有幂是合数的数才是符合要求的.而幂不会超过64,预处理出64以内的合数. 因为最小的合数是4,所以枚举的上限是2的16 ...

  6. flex 客户端缓存SharedObject

    读取缓存: usernameSO = SharedObject.getLocal('username'); if (usernameSO) { usernameSOAL = usernameSO.da ...

  7. nginx ip无法访问

    CentOS 7.0默认使用的是firewall作为防火墙,这里改为iptables防火墙步骤. 1.关闭firewall: systemctl stop firewalld.service #停止f ...

  8. poj2431 一直Wa

    在遍历加油站的时候,会将经过的x加油站放入优先队列,之后将x从数组中删掉,即用最后一个加油站来替代x:这时如果不 “i--”,则会漏掉检查原来的stop[n-1],则可能造成错误. if(stop[i ...

  9. Arcgis Javascript API 开发笔记

    JS API3.4的要求 à(1)  IE9或以上版本 否则dijit1.8.3不匹配 1.如何发布ArcgisJavascript API应用 0.准备工作: (1).有web应用: (2).有js ...

  10. Spring AOP 前奏--动态代理