(转自: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高级教程-返回函数

    函数作为返回值 高阶函数除了可以接收函数作为参数外,还可以把函数作为结果值返回. 要实现一个可变参数的求和.通常情况下,求和的函数是这样定义的: def calc_sum(*args): ax = 0 ...

  2. 企业内部安全宣贯:乌云网停摆事件的思考与评论——By Me

    2016年7月20日,“自由平等开放的漏洞报告平台”乌云网[1] 被迫停摆,包括乌云网创始人方小顿[2] 在内的多名高管突然被捕.乌云的存在可以说是为了修复人们长期缺失的安全意识和堪忧的安全生态,但是 ...

  3. Android Wear - Design Principles for Android Wear(设计原则)

    ---------------------------------------------------------------------------------------------------- ...

  4. JS连等赋值的坑

    cnblogs标题: JS连等赋值的坑 关于JS连等赋值有个经典的笔试题: var a = {n: 1}; var b = a; a.x = a = {n: 2}; console.log(a.x); ...

  5. Grunt JS构建环境搭建以及使用入门

    Grunt JS构建环境搭建以及使用入门 1.应用场景 一种自动化任务处理工具,对于日常的需求(代码规则检查.代码合并)可以实现自动化执行,只需要保留package.json和Gruntfile.js ...

  6. MySQL之 视图,触发器,事物,存储过程,函数(Day48)

    阅读目录 一.视图 二.触发器 三.事物 四.存储过程 五.函数 六.流程控制 一.视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名 ...

  7. go——通道

    相比Erlang,go并未实现严格的并发安全.允许全局变量.指针.引用类型这些非安全内存共享操作,就需要开发人员自行维护数据一致和完整性.Go鼓励使用CSP通道,以通信来代替内存共享,实现并发安全.作 ...

  8. go——结构体(二)

    Go语言是一种静态类型的编程语言.这意味着,编译器需要在编译时知晓程序里每个值的类型. 如果提前知道类型信息,编译器就可以确保程序合理的使用值. 这有助于减少潜在的内存异常和bug,并且使编译器有机会 ...

  9. zend studio设置utf8

    1. windows -> preference -> general -> workspace 2.项目右键 -> properities -> resource 3. ...

  10. r.js打包注意事项 r.js打包 这个是配合require.js打包的

    这个./代表的是当前文件的父目录....打包的资源一定要在这个父目录中下面才行,,,,一定一定,要放在这个目录一下才能被正确找到. 不然只是copy了一份一模一样的文件夹和文件过去,并不会处理压缩啥的 ...