Qt Event Dispatcher学习
来源:互联网 发布:医院网络割接方案 编辑:程序博客网 时间:2024/06/05 15:48
距离上次整理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()函数。
(图片来源:http://www.slideshare.net/mariusbu/qt-widgets-in-depth,下同)
这个东西不涉及事件队列、事件循环等等东西。但是事件过滤在这个过程中正常起作用。而且除过滤器外,下面三个函数在派生类中都可以被覆盖(以处理这个事件):
- 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模块。就是和窗口系统(重绘、移动等等事件)以及键鼠事件有关了。
参考
http://doc.qt.nokia.com/4.7/eventsandfilters.html
http://doc.qt.nokia.com/qq/qq11-events.html
http://blog.csdn.net/dbzhang800/article/details/6566863
http://hi.baidu.com/cyclone/blog/item/fe6ab3de0e9f2155ccbf1aea.html
- Qt Event Dispatcher学习
- UE4: Event Dispatcher
- event generator,event dispatcher,event handler.
- qt event 学习笔记5
- Qt学习之路(19): 事件(event)
- Qt学习之路(21): event()
- Qt学习之路(19): 事件(event)
- Qt学习之路(21): event()
- Qt学习之路(19): 事件(event)
- Qt学习之路(19): 事件(event)
- Qt学习之路(21): event()
- Qt学习之路(19): 事件(event)
- Qt学习之路(21): event()
- Qt学习之路(21): event()
- Qt学习之路(21): event()
- QT学习记录(一)事件 (event)
- Qt学习之路(19): 事件(event)
- Qt学习之路(19): 事件(event)
- CxImage下载
- Java nio 实现socket异步通信 (对Java nio 实习笔记五中内容做一纠正)
- VBScript 访问SQL数据库
- 458 - The Decoder
- Linux命令大全——umask命令
- Qt Event Dispatcher学习
- Android盈利模式,哪种更靠谱?
- Linux命令大全——ftp命令
- Linux命令使用大全——lsof用法
- C#中的String类
- 中国黑客首度进行民间技术分级 实力成员仅百名
- 提升磁盘IO性能的几个技巧
- JavaMail发送邮件程序
- 一个关于struct的问题