(转自: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. python基于yield实现协程

    def f1(): print(11) yield print(22) yield print(33) def f2(): print(55) yield print(66) yield print( ...

  2. Linux学习笔记—vim程序编辑器

    vi和vim vim是vi的升级版,支持vi的所有指令 vi的使用 vi分为三种模式:一般模式.编辑模式.命令行模式 一般模式 以vi打开一个文件就直接进入一般模式了,这个模式下可以使用上下左右按键来 ...

  3. 用仿ActionScript的语法来编写html5——第六篇,TextField与输入框

    一,对比1,html5中首先看看在html5的canvas中的文字显示 var canvas = document.getElementById("myCanvas"); var ...

  4. pgadmin3

    一般性  \copyright            显示PostgreSQL的使用和发行许可条款  \g [文件] or;     执行查询 (并把结果写入文件或 |管道)  \gset [PREF ...

  5. matlab循环保存dat文件

    将数据保存为dat文件 这里有两种方法,第一种是: save filename dataname; 这种方法书写简单,但是功能也很简单.这里的filename就是死的filenam,即filename ...

  6. jmeter 非GUI模式下测试报错An error occurred: Unknown arg:

    D:\download\性能工具\JMeter\apache-jmeter-2.11\apache-jmeter-2.11\bin>jmeter -n -t E:\性能测试\jmeter scr ...

  7. HDU - 6311 Cover (欧拉路径)

    题意:有最少用多少条边不重复的路径可以覆盖一个张无向图. 分析:对于一个连通块(单个点除外),如果奇度数点个数为 k,那么至少需要max{k/2,1}  条路径.将奇度数的点两两相连边(虚边),然后先 ...

  8. 浏览器 Event对象 及 属性 的兼容处理

    摘自: http://blog.csdn.net/jiachunfeng/article/details/6448186 event对象 IE 中可以直接使用 event 对象,而 FF 中则不可以, ...

  9. Entity FrameWork Code First无法生成数据库 解决办法

    我是控制台应用程序,没有connectionStrings,试了几个方法也都不可以. 这是别人的博客用其他方法. http://www.cnblogs.com/Gyoung/archive/2013/ ...

  10. Apache 日志管理

    日志参数 %% 百分号(Apache2.0.44或更高的版本) %a 远端IP地址 %A 本机IP地址 %B 除HTTP头以外传送的字节数 %b 以CLF格式显示的除HTTP头以外传送的字节数,也就是 ...