`
tomhibolu
  • 浏览: 1430926 次
文章分类
社区版块
存档分类
最新评论

Qt Event Dispatcher学习

 
阅读更多

距离上次整理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模块。就是和窗口系统(重绘、移动等等事件)以及键鼠事件有关了。

参考


分享到:
评论

相关推荐

    Event Dispatcher and callback list for C++.zip

    在C++编程中,事件调度器(Event Dispatcher)和回调列表(Callback List)是实现异步处理和消息传递的关键机制。这些概念对于构建响应式、高效且可扩展的应用程序至关重要。下面将详细介绍这两个主题。 首先,事件...

    qt-event-dispatcher-libuv:将libuv添加为Qt事件循环的受支持后端

    适用于libuv的Qt Event Dispatcher 事件调度程序将libuv添加为Qt事件循环的受支持后端。 当前,此存储库中省略了构建脚本,因为它们当前作为子模块包含在,并共享其构建设置。 请参阅qtjs-generator中的tests/...

    qtspeech-5.10_qtspeech_qtspeak_qt语音_qt语音识别_qtqtexttospeech_

    通过研究这些代码,你可以学习如何在Qt项目中有效地集成语音功能。 总的来说,Qt的语音处理能力为开发者提供了强大的工具,使他们能够在跨平台的环境中创建具有语音交互特性的应用程序。无论是语音识别还是文本转...

    simple-event-dispatcher:简单的PSR-14事件分派器

    `simple-event-dispatcher`项目就是一个符合PSR-14标准的轻量级事件分派器实现。 ### 1. PSR-14规范 PSR-14规范定义了两个主要接口:`Psr\EventDispatcher\EventDispatcherInterface`和`Psr\EventDispatcher\...

    event_dispatcher:event_dispatcher 实现了观察者设计模式的轻量级版本

    event_dispatcher event_dispatcher gem 提供了一个简单的观察者实现,允许您以简单有效的方式订阅和侦听应用程序中的事件。 它受到强烈启发 安装 安装宝石: gem install event_dispatcher 访问宝石: ...

    Generic Event Dispatcher-开源

    "GED",全称为"Generic Event Dispatcher",正是一个专为此目标而生的开源解决方案。这个强大的工具致力于优化网络环境中的数据流动和协调,为开发者提供了高效、灵活的事件处理机制。 一、什么是GED? GED,通用...

    QT文本转语音模块使用指南

    它支持跨平台使用,根据不同的操作系统,调用不同的TTS引擎:在Linux下,它会调用speech-dispatcher;而在Windows等其他平台上,则调用各自平台的TTS引擎。要确保本地TTS引擎是可用的状态,否则可能会导致程序崩溃或...

    Event-Dispatcher:一个 JavaScript 事件调度器

    // create an event dispatcher var dispatcher = new gwa . EventDispatcher ( ) ; // add a listener var callback = function ( arg ) { console . log ( arg ) ; } ; var idlistener = dispatcher . on ( 'FOO...

    qt_eventdispatcher_libevent-master.zip

    在Qt框架中,事件调度器(Event Dispatcher)负责管理应用程序的事件循环,接收并处理各种事件。通过结合Libevent,开发者可以为Qt应用提供更高效、低延迟的网络事件处理,例如HTTP、TCP、UDP等协议的通信。 【标签...

    GUI--QTE2.2源码.rar

    QTE(Qt Event Dispatcher)是Qt框架下的一种事件分发机制,用于处理应用程序中的各种事件,如键盘输入、鼠标点击等。 QTE2.2是Qt Event Dispatcher的一个特定版本,它可能包含了对之前版本的改进和优化,以提供更...

    eventdispatcher:C ++ Event Dispatcher支持TCP,UDP,管道,文件系统,TLS,优先级,OnOff,线程,永久连接等

    特征Event Dispatcher具有许多功能,这是此库中的主要功能: TCP-普通和加密(TLS) UDP-直接和广播RPC-基于文本的消息通信调度程序-自动调度RPC消息事件-支持许多基于文件描述符的事件接受套接字(服务器) 套接字...

    event-dispatcher:PSR-14事件分配器

    Yii Event Dispatcher 兼容的事件分派器提供了分派事件和侦听所分派事件的功能。 特征 兼容。 简单轻巧。 鼓励设计事件层次结构。 可以组合多个事件侦听器提供程序。 安装 该软件包可以与作曲家一起安装: ...

    Laravel开发-dispatcher

    在`event()`函数中定义事件,然后在`listen()`中绑定相应的处理函数,这样当事件触发时,调度的任务就会被执行。 5. 执行调度任务: 在开发环境中,可以使用`php artisan schedule:run`命令手动运行调度器,但生产...

    typed-event-dispatcher:[NPM软件包]强类型事件,可以公开收听,但只能在内部调度

    npm install typed-event-dispatcher // Import as an ES Module. import { TypedEventDispatcher } from "typed-event-dispatcher" ; // Or require as a CommonJS Module. const { TypedEventDispatcher } = ...

    【QT】16 事件分发器/过滤器文章代码

    本文将深入探讨QT中的事件分发器(Event Dispatcher)和事件过滤器(Event Filter)的概念、作用以及如何实现它们。 事件分发器在QT中负责管理并分配事件到相应的对象。每当有新的事件发生时,比如鼠标点击或键盘...

    C++Event机制的简单实现

    - **事件分发器(Event Dispatcher)**:负责将事件传递给相应的事件监听器。 ##### 3. 事件模型的过程 事件模型的一般流程如下: 1. **注册事件监听器**:开发者需要为特定的事件源注册一个或多个事件监听器。 2. ...

    event-dispatcher:灵活PHP事件分配库

    $ composer require slince/event-dispatcher用法创建一个事件调度程序 $ dispatcher = new Slince \ EventDispatcher \ Dispatcher ();为指定的事件添加一个侦听器侦听器有两种类型: callable和Slince\...

    Dispatcher,.zip

    要深入学习和使用Dispatcher,你需要: - 访问项目的GitHub或其他代码托管平台,阅读README文件获取快速入门指南。 - 探索项目的源代码结构,理解各个模块的功能。 - 查阅项目文档,了解如何配置和使用Dispatcher。...

    event-dispatcher:EventDispatcher组件提供了一些工具,这些工具允许您的应用程序组件通过分派事件并侦听它们来相互通信

    $dispatcher->dispatch(new UserRegistered($user)); ``` 8. **处理事件**:当事件被调度后,所有的监听器都会按优先级顺序执行。监听器可以根据事件实例中的数据进行相应的处理。 9. **PSR-14兼容**:Symfony的...

Global site tag (gtag.js) - Google Analytics