距离上次整理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
- QEventDispatcherMac
- ...
这堆东西还挺多,不过下面三个属于QtCore模块
QEventDispatcherGlib
|
使用glib事件循环,有助于和Gtk的集成
|
QEventDispatcherUNIX
|
默认的glib不可用时,就用这个喽
|
QEventDispatcherWin32
|
Qt 创建一个带回调函数的隐藏窗口来处理事件。
|
我们能看的到的就是,它们提供
的注册、反注册功能。并将系统底层对应事件转换成Qt事件。
其他的属于QtGui模块。就是和窗口系统(重绘、移动等等事件)以及键鼠事件有关了。
参考
分享到:
相关推荐
Event Dispatcher and callback list for C++
适用于libuv的Qt Event Dispatcher 事件调度程序将libuv添加为Qt事件循环的受支持后端。 当前,此存储库中省略了构建脚本,因为它们当前作为子模块包含在,并共享其构建设置。 请参阅qtjs-generator中的tests/...
event_dispatcher event_dispatcher gem 提供了一个简单的观察者实现,允许您以简单有效的方式订阅和侦听应用程序中的事件。 它受到强烈启发 安装 安装宝石: gem install event_dispatcher 访问宝石: ...
// create an event dispatcher var dispatcher = new gwa . EventDispatcher ( ) ; // add a listener var callback = function ( arg ) { console . log ( arg ) ; } ; var idlistener = dispatcher . on ( 'FOO...
GED代表通用事件调度程序。 GED处理网络分布式环境中的可调数据传输和同步。
特征Event Dispatcher具有许多功能,这是此库中的主要功能: TCP-普通和加密(TLS) UDP-直接和广播RPC-基于文本的消息通信调度程序-自动调度RPC消息事件-支持许多基于文件描述符的事件接受套接字(服务器) 套接字...
简单事件调度程序简单的PSR-14事件分派器实现
Yii Event Dispatcher 兼容的事件分派器提供了分派事件和侦听所分派事件的功能。 特征 兼容。 简单轻巧。 鼓励设计事件层次结构。 可以组合多个事件侦听器提供程序。 安装 该软件包可以与作曲家一起安装: ...
基于Qt平台的语音识别(转载自github,如有侵权,联系删除)
npm install typed-event-dispatcher // Import as an ES Module. import { TypedEventDispatcher } from "typed-event-dispatcher" ; // Or require as a CommonJS Module. const { TypedEventDispatcher } = ...
$ composer require slince/event-dispatcher用法创建一个事件调度程序 $ dispatcher = new Slince \ EventDispatcher \ Dispatcher ();为指定的事件添加一个侦听器侦听器有两种类型: callable和Slince\...
This is light-weight event dispatcher based on KOTLIN priority: Int? = null to subscribe function for sorting Inline function Included You can subscribe on event by calling: val EVENT_CALL_ONE = ...
Laravel开发-dispatcher 在应用程序中计划Artisan命令
OpenWrt dispatcher说明文档,
EventDispatcher组件EventDispatcher组件提供了一些工具,使您的应用程序组件可以通过分派事件并侦听事件来相互通信。资源资源并在
plexus-sec-dispatcher-1.3.jar
事件 轻量级事件管理,由Go实现的调度工具库 支持自定义事件对象 支持将多个侦听器添加到事件 支持设置事件监听器的优先级。...Trigger/Fire(name string, params M) (error, Event)触发事件 MustTrigger/MustFi
事件调度程序 该存储库包含与有关的所有接口。 请注意,这不是Event Dispatcher本身的实现。 仅仅是描述事件调度程序组件的接口。 您可以在包装专家上找到该规范的和。
event-dispatcher:介体和观察者模式事件库
Laravel开发-dispatcher 任务分发器 计划任务分配器(直接可替换掉cron),L5内设置了类似的功能