QAbstractEventDispatcher

QAbstractEventDispatcher Class

QAbstractEventDispatcher 提供管理Qt's Event 队列的接口。

事件分发器接受来自系统和其他源的事件。然后将它们送到QCoreApplication和QApplication实例处理。它提供颗粒度的控制。

一个简单例子是: QCoreApplication::processEvents();
使用instance() 返回一个对象的实例。如果你想使用自己的QAbstractEventDispather实例,你必须要在默认的事件分发安装前,使用QCoreApplication::setEventDispatcher() or QThread::setEventDispatcher() 安装。

事件的主循环在调用QCoreApplication::exec()开始,在调用QCoreApplication::exit().

Local event loops can be created using QEventLoop.

Programs that perform long operations can call processEvents() with a bitwise OR combination of various QEventLoop::ProcessEventsFlag values to control which events should be delivered.

QAbstractEventDispatcher also allows the integration of an external event loop with the Qt event loop.

###API

QAbstractEventDispatcher(QObject * parent = 0)
~QAbstractEventDispatcher()
bool    filterNativeEvent(const QByteArray & eventType, void * message, long * result)
virtual void    flush() = 0
void    installNativeEventFilter(QAbstractNativeEventFilter * filterObj)
virtual void    interrupt() = 0
virtual bool    processEvents(QEventLoop::ProcessEventsFlags flags) = 0
virtual bool    registerEventNotifier(QWinEventNotifier * notifier) = 0
virtual void    registerSocketNotifier(QSocketNotifier * notifier) = 0
int registerTimer(int interval, Qt::TimerType timerType, QObject * object)
virtual void    registerTimer(int timerId, int interval, Qt::TimerType timerType, QObject * object) = 0
virtual QList<TimerInfo>    registeredTimers(QObject * object) const = 0
virtual int remainingTime(int timerId) = 0
void    removeNativeEventFilter(QAbstractNativeEventFilter * filter)
virtual void    unregisterEventNotifier(QWinEventNotifier * notifier) = 0
virtual void    unregisterSocketNotifier(QSocketNotifier * notifier) = 0
virtual bool    unregisterTimer(int timerId) = 0
virtual bool    unregisterTimers(QObject * object) = 0
virtual void    wakeUp() = 0

转载于:https://www.cnblogs.com/lnstree/p/4846677.html

<think>好的,我现在需要回答用户关于Qt事件队列实现原理的问题,特别是源码层面的解析。首先,我需要回顾自己了解的Qt事件处理机制,并结合提供的引用资料来组织回答。 根据用户提供的引用,引用[1]提到事件过滤器,允许在事件到达目标对象前拦截处理。引用[2]提到事件分发器(event dispatcher)负责从窗口系统接收事件并发送给QCoreApplication处理,QAbstractEventDispatcher提供了细粒度的事件交付控制。引用[3]则指出QCoreApplication::notify()是事件处理的核心,事件交付机制灵活。 首先,Qt的事件队列管理应该涉及事件的分发、存储和处理流程。事件队列可能由事件分发器维护,例如QAbstractEventDispatcher的子类,比如Windows平台的QEventDispatcherWin32。事件队列的实现可能与平台相关,但通过抽象层统一接口。 接下来,需要分析事件队列的工作流程。当事件产生时,如用户输入、定时器或网络事件,这些事件会被事件分发器收集并放入队列。然后,事件循环(QEventLoop)会不断从队列中取出事件,通过notify()方法分发给相应的目标对象进行处理。这里需要说明事件是如何被存储和调度的,可能涉及队列的数据结构,如优先级队列或普通队列,处理顺序(如定时器事件优先)。 另外,引用[3]提到QCoreApplication::notify()是事件处理的核心,负责将事件传递给接收者的event()方法。因此,事件队列中的事件在被取出后,会通过notify()传递给目标对象,可能经过事件过滤器处理,如引用[1]中的示例。 在源码层面,可能需要查看QCoreApplication、QEventLoop、QAbstractEventDispatcher等相关类的实现。例如,QEventLoop::exec()启动事件循环,不断调用processEvents()处理事件。而QAbstractEventDispatcher负责管理事件队列,其具体实现如QEventDispatcherWin32会处理Windows消息循环,将消息转换为Qt事件并放入队列。 还需要考虑不同事件类型的处理方式,比如定时器事件、绘图事件等,是否会有不同的队列或优先级。例如,立即事件(如绘图事件)可能需要优先处理,而用户输入事件可能按顺序处理。 最后,需要结合用户的问题,整理出Qt事件队列的实现原理,包括事件的分发、存储、处理流程,以及涉及的类和关键方法。同时,根据要求生成相关问题,如事件循环机制、自定义事件处理、事件过滤器与事件队列的关系等。</think>### Qt事件队列实现原理解析 #### 1. 核心组件与流程 Qt事件队列的实现依赖于以下核心组件: - **QEventLoop**:管理事件循环,通过`exec()`启动循环并持续处理事件[^3] - **QAbstractEventDispatcher**:平台相关的事件分发器(如`QEventDispatcherWin32`),负责从操作系统收集事件并存入队列[^2] - **QCoreApplication**:作为事件处理中枢,其`notify()`方法负责事件派发 事件处理流程: ``` 操作系统事件 -> 事件分发器 -> 事件队列 -> QEventLoop处理 -> QCoreApplication::notify() -> 目标对象 ``` #### 2. 事件队列数据结构 在Qt源码中,事件队列采用**双缓冲队列**设计: - 主队列(`QEventDispatcher::queuedEvents`):存储待处理事件 - 临时队列(`QEventDispatcher::postEventList`):接收新到达事件 - 通过交换指针实现无锁队列切换(`qSwap(queuedEvents, postEventList)`) 关键代码片段: ```cpp // qeventdispatcher_win.cpp while (!interrupt) { // 处理定时器事件 processTimers(); // 交换队列并处理事件 QCoreApplicationPrivate::sendPostedEvents(0, 0); } ``` #### 3. 事件类型与优先级 Qt定义了5级事件优先级(源码`qcoreevent.h`): 1. HighPriority 2. NormalPriority(默认) 3. LowPriority 4. IdlePriority 5. DeferredDelete(特殊类型) 事件插入算法: ```cpp void QCoreApplication::postEvent(QObject *receiver, QEvent *event, int priority) { // 根据优先级插入到队列指定位置 if (priority > currentEventPriority) { queue.prepend(event); } else { queue.append(event); } } ``` #### 4. 关键源码解析 1. **事件入队**: ```cpp // qcoreapplication.cpp void QCoreApplication::postEvent(QObject *receiver, QEvent *event) { QThreadData *data = receiver->d_func()->threadData; data->postEventList.addEvent(QPostEvent(receiver, event)); // 唤醒事件循环(如果处于等待状态) QAbstractEventDispatcher::instance(data->thread)->wakeUp(); } ``` 2. **事件处理**: ```cpp // qcoreapplication.cpp bool QCoreApplication::notify(QObject *receiver, QEvent *event) { // 先执行事件过滤器 if (receiver->d_func()->filter_event(event)) return true; // 分发到具体事件处理函数 return receiver->event(event); } ``` #### 5. 平台适配实现 Windows平台使用`QEventDispatcherWin32`: - 通过`MsgWaitForMultipleObjectsEx`实现高效等待 - 将Windows消息转换为Qt事件(如`WM_PAINT`→`QPaintEvent`) - 特殊处理`WM_QUIT`消息的转换和传递 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值