距离上次整理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. c标签判断true false jsp_巧妙使用if(true)以及if(false)语句
  2. python常用模块大全总结-常用python模块
  3. linux运行windows环境变量,使用环境变量识别Cygwin,Linux,Windows
  4. 飘逸的python - hack输出流便于调试
  5. 用批处理修复 win10 无法升级的问题
  6. .Net性能调优-垃圾回收!!!最全垃圾回收来了
  7. android studio真机调试失败,【Android】Android Studio真机调试的问题统整
  8. C++函数参数是结构体或者数组(cstdarg/.../va_arg/va_end)
  9. 基于FPGA实现uart串口模块(Verilog)--------发送模块及整合
  10. tensorflow之cast
  11. 搜狐畅游一面(c++)
  12. 短信机bug,发短信发的直吐血…………
  13. R语言的读取文件的相关学习(读取数据库,网页,EXCEL文件)
  14. jmeter ramp-up-period设置以及同步定时器使用
  15. 多糖水凝胶的交联方式及分析方法
  16. 2022年10月24日程序员节日快乐
  17. Python是个什么鬼?为什么那么多工作“会Python优先”?
  18. STM32 Bootloader开发记录 3 固件签名校验
  19. 有一个类似”abbc,d d.eeffgg,59.30ABDFR ”这样的包含大小写字母,数字,空格,逗号和句号的字符串,求各字符的数量。(设计一个一个函数,传入字符串,返回各字符数量的数据)
  20. 华测教育入选【腾讯课堂 · 薪选课程】--这可能是你进腾讯的最好机会!

热门文章

  1. 又一个程序猿的奋斗史——第一章 初入职场
  2. 华为云挂载盘配置挂载
  3. 如何将PDF转换为PPT?2个免费好用的pdf转ppt工具
  4. 最强文献下载神器——SCI-HUB客户端v7.0
  5. 《深入理解计算机系统》(CSAPP)实验七 —— Malloc Lab
  6. 虚拟机打开安卓模拟器VT
  7. 我在木星——开始也意味着不再安逸
  8. 如何用c语言画个叮当猫,如何使用CSS3画出一个叮当猫
  9. 虚拟机无法建立与服务器的连接,无法通过 Vmconnect 连接到虚拟机 - Windows Server | Microsoft Docs...
  10. 《荀子·劝学篇》原文 翻译