距离上次整理Qt事件系统已经过了14个月了。重新理理思绪:

Qt中的事件大致可分为3类:

Spontaneous events

从系统得到的消息:鼠标按键、键盘按键、定时器事件等。转化为QEvent后被Qt事件系统依次处理

Posted events

由Qt或应用程序直接生成,放入Qt消息队列

QCoreApplication::postEvent()

Sent events

由Qt或应用程序产生,不放入队列直接被派发和处理

QCoreApplication::sendEvent()

本文中,先简单看一下后两种,然后重点看看第一种。

Sent events

比如,发送按键"X"的事件到 mainWin 窗口。

QKeyEvent event(QEvent::KeyPress, Qt::Key_X, Qt::NoModifier, "X", 0

);

QApplication::sendEvent(mainWin, &event);

如果没有过滤器的话,这其实就是直接调用 mainWin 的 keyPressEvent()函数。

这个东西不涉及事件队列、事件循环等等东西。但是事件过滤在这个过程中正常起作用。而且除过滤器外,下面三个函数在派生类中都可以被覆盖(以处理这个事件):

QApplication::notify()

QWidget::event()

QWidget::keyPressEvent()

Posted events

比如,同样是发送按键"X"的事件到 mainWin 窗口,我们可以使用postEvent()。

QApplication::postEvent(mainWin, new QKeyEvent(QEvent::KeyPress, Qt::Key_X, Qt::NoModifier, "X", 0

));

这会将该事件放入Qt自己的事件队列中,事件循环QEventLoop空闲时会判断该队列是否为空。最终使用 sendEvent() 依次派发事件队列中的这些事件。

也可以手动使用

QCoreApplication::sendPostedEvents()

清空当前线程事件队列(即派发队列中的事件)

注意:每一个线程有一个事件队列。

Spontaneous events

系统底层事件是通过 QAbstractEventDispatcher 整合进Qt的事件循环的。

Event dispatcher接受窗口系统以及其他源中的事件。它对事件的传递提供了一种精细控制的能力。

QAbstractEventDispatcher

QEventDispatcherUNIX

QEventDispatcherX11

QEventDispatcherQWS

QEventDispatcherQPA

QEventDispatcherGlib

QGuiEventDispatcherGlib

QWSEventDispatcherGlib

QEventDispatcherWin32

QGuiEventDispatcherWin32

QEventDispatcherMac

...

这堆东西还挺多,不过下面三个属于QtCore模块

QEventDispatcherGlib

使用glib事件循环,有助于和Gtk的集成

QEventDispatcherUNIX

默认的glib不可用时,就用这个喽

QEventDispatcherWin32

Qt 创建一个带回调函数的隐藏窗口来处理事件。

我们能看的到的就是,它们提供

Timer

SockerNotifer

的注册、反注册功能。并将系统底层对应事件转换成Qt事件。

其他的属于QtGui模块。就是和窗口系统(重绘、移动等等事件)以及键鼠事件有关了。

参考

qt中sendevent_Qt Event Dispatcher学习相关推荐

  1. qt中sendevent_Qt中postEvent和sendEvent函数

    Qt中postEvent和sendEvent函数 部分内容参考http://blog.csdn.net/lvmengzou/article/details/65450908 qt事件循环需要维护一个事 ...

  2. Qt中mouseMoveEvent(QmouseEvent *event)使用探讨

    Qt中mouseMoveEvent(QmouseEvent *event)使用探讨 在学习网络教程过程中,尝试使用Qpainter制作一个涂鸦板,需要使用QmouseEvent ,按照教程,涂鸦板不能 ...

  3. QT学习之解决QT中QIcon图标不显示的问题

    QT学习之解决QT中QIcon图标不显示的问题 参考文章: (1)QT学习之解决QT中QIcon图标不显示的问题 (2)https://www.cnblogs.com/yang12318/p/1069 ...

  4. Kinect+OpenNI学习笔记之6(获取人体骨架并在Qt中显示)

    前言 MS的kinec SDK和OpenNI都提供了人体骨骼跟踪的算法,人体骨骼跟踪算法在kinect人体行为识别中非常重要,该识别过程通常被用来作为行为识别的第一步, 比如说,通过定位人体中的骨骼支 ...

  5. alin的学习之路:在Qt中使用Oracle数据库

    alin的学习之路:在Qt中使用Oracle数据库 1. 准备工作 在Qt中安装好Source插件,将其中的oci模块进行编译,注意要在oci.pro中指定数据块的动态库和头文件路径 需要在Qt项目文 ...

  6. C++ Qt学习笔记(3)QT中的文本处理

    1. 富文本和纯文本的概念: 纯文本: 例如一个txt文件打开,里面只有文本内容,除此之外什么都没有,非常单调,这既是纯文本. 富文本:   例如一个.doc的word文件,打开之后,不但有文字,还有 ...

  7. qt5 -- qt中关于大小的类的学习笔记

    QSize 这个精度是整型的 QSize定义了一个二维大小,包含宽度(width)和高度(height): 显然,一个QSize有三个函数:宽width(),高height(),比例scale() 可 ...

  8. Qt中内存泄露和半自动内存管理

    Qt中帮程序员做了一些内存回收的事情,但正因为这些反而让对此不熟悉的人会屡屡犯错. 收录一篇不错的文章: 在C++中学习过程中,我们都知道: delete 和 new 必须 配对使用(一 一对应):d ...

  9. qt中 accept()和ignore()函数

    首先来看一段代码: //!!! Qt5 // ---------- custombutton.h ---------- // class CustomButton : public QPushButt ...

最新文章

  1. 2.5e2.0是合法的c语言常量,二级考试C语言程序设计.ppt
  2. 中修改环境变量_超详干货!Linux环境变量配置全攻略
  3. java socket绑定ip_ServerSocket 默认邦定IP
  4. 弱网测试用什么农_为什么用木蜡油做的家具,用甲醛测试仪测试会显示甲醛超标?...
  5. c语言程序结果 856400,《C语言程序设计教程》习题参考解析1.doc
  6. 4k视频写入速度要求_看4K视频到底需要多快的网速?
  7. VNX VMX and delete luns
  8. 暴雪守望先锋显示连接暴雪服务器超时,守望先锋 连接暴雪游戏服务器超时
  9. Java 中文按拼音进行排序
  10. 中国这10家慕课网站,您需要知道
  11. 【Android 学习】之二维码扫描开发(闪光灯功能)
  12. FreeRTOS+STM32L+BC20+MQTT协议传输温湿度数据,控制继电器云平台——④华为云
  13. 算法:数组中寻找两个数字的和等于固定值
  14. 用python动态演示照片立方体_3分钟在线演示用 python 生成分形图片
  15. 嵌入式程序编写方法与规范
  16. 基于深度强化学习的室内场景目标驱动视觉导航
  17. Cocos2d 官网介绍,新手必看!!!!!!!!!!!!!!!!!!!!!!!!!
  18. sql中的Power函数(幂运算)
  19. 计算机三年规划书1000字,大学职业生涯规划书1000字.docx
  20. Java进制转换之十六进制转八进制

热门文章

  1. 【JS】javascript正则表达式的基本使用(JavaScript RegExp 对象)
  2. 零中频接收机频率转换图_复数RF混频器零中频架构及高级算法:下一代SDR收发器中的黑魔法...
  3. matlab - 3 自由度的机械臂
  4. 被腾讯起诉抄袭《王者荣耀》的公司发声明,重点却是法官
  5. 在不支持AirDrop的Mac上开启和使用AirDrop的方法
  6. java 堆中的永久代_JVM中的堆的新生代、老年代、永久代详解
  7. 自学JAVA的我提交给2020的问卷答案,JAVA核心知识点分享这一年来的努力并没有白费!
  8. 俄罗斯方块实验报告(附源码)
  9. 点亮LED灯驱动编写过程
  10. java素数的流程图_Java程序流程结构