QAbstractEventDispatcher Class
QAbstractEventDispatcher 类提供了一个用于管理 Qt 事件队列的接口。更多内容...
| 头文件: | #include <QAbstractEventDispatcher> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
| 继承自: | QObject |
| 被继承者: |
- 所有成员列表,包括继承的成员
- 已弃用的成员
- QAbstractEventDispatcher 属于事件类。
公共类型
| struct | TimerInfoV2 |
| Duration |
公共函数
| QAbstractEventDispatcher(QObject *parent = nullptr) | |
| virtual | ~QAbstractEventDispatcher() |
| bool | filterNativeEvent(const QByteArray &eventType, void *message, qintptr *result) |
| void | installNativeEventFilter(QAbstractNativeEventFilter *filterObj) |
| virtual void | interrupt() = 0 |
| virtual bool | processEvents(QEventLoop::ProcessEventsFlags flags) = 0 |
| virtual void | registerSocketNotifier(QSocketNotifier *notifier) = 0 |
(since 6.8) void | registerTimer(Qt::TimerId timerId, QAbstractEventDispatcher::Duration interval, Qt::TimerType timerType, QObject *object) |
| virtual void | registerTimer(int timerId, qint64 interval, Qt::TimerType timerType, QObject *object) = 0 |
(since 6.8) Qt::TimerId | registerTimer(QAbstractEventDispatcher::Duration interval, Qt::TimerType timerType, QObject *object) |
| virtual QList<QAbstractEventDispatcher::TimerInfo> | registeredTimers(QObject *object) const = 0 |
| virtual int | remainingTime(int timerId) = 0 |
| QAbstractEventDispatcher::Duration | remainingTime(Qt::TimerId timerId) const |
| void | removeNativeEventFilter(QAbstractNativeEventFilter *filter) |
(since 6.8) QList<QAbstractEventDispatcher::TimerInfoV2> | timersForObject(QObject *object) const |
| virtual void | unregisterSocketNotifier(QSocketNotifier *notifier) = 0 |
(since 6.8) bool | unregisterTimer(Qt::TimerId timerId) |
| virtual bool | unregisterTimer(int timerId) = 0 |
| virtual bool | unregisterTimers(QObject *object) = 0 |
| virtual void | wakeUp() = 0 |
信号
| void | aboutToBlock() |
| void | awake() |
静态公共成员
| QAbstractEventDispatcher * | instance(QThread *thread = nullptr) |
详细说明
事件分发器从窗口系统和其他来源接收事件,然后将它们发送给QCoreApplication 或QApplication 实例进行处理和分发。QAbstractEventDispatcher 提供了对事件分发的精细控制。
若需简单控制事件处理,请使用QCoreApplication::processEvents()。
若需更精细地控制应用程序的事件循环,请调用instance(),并调用返回的 QAbstractEventDispatcher 对象上的函数。 如果要使用自己的 QAbstractEventDispatcher 实例或 QAbstractEventDispatcher 子类的实例,必须在安装默认事件分发器之前,通过QCoreApplication::setEventDispatcher() 或QThread::setEventDispatcher() 将其安装。
通过调用QCoreApplication::exec() 可以启动主事件循环,通过调用QCoreApplication::exit() 可以停止主事件循环。可以使用QEventLoop 创建本地事件循环。
执行长时间操作的程序可以通过将processEvents() 与各种QEventLoop::ProcessEventsFlag 值的位或组合一起调用,来控制应传递哪些事件。
QAbstractEventDispatcher 还允许将外部事件循环与 Qt 事件循环集成。
另请参阅 QEventLoop 、QCoreApplication 和QThread 。
成员类型文档
[alias] QAbstractEventDispatcher::Duration
一种std::chrono::duration 类型,用于本类中的各种API。该类型的存在是为了便于将来向更高或更低粒度进行转换。
在所有当前平台中,该类型均为 `nanoseconds`。
成员函数文档
[explicit] QAbstractEventDispatcher::QAbstractEventDispatcher(QObject *parent = nullptr)
使用给定的parent 构建一个新的事件分发器。
[virtual noexcept] QAbstractEventDispatcher::~QAbstractEventDispatcher()
销毁事件分发器。
[signal] void QAbstractEventDispatcher::aboutToBlock()
在事件循环调用可能导致阻塞的函数之前,会发出此信号。
另请参阅 awake()。
[signal] void QAbstractEventDispatcher::awake()
当事件循环从一个可能阻塞的函数返回后,会发出此信号。
另请参阅 wakeUp() 和aboutToBlock()。
bool QAbstractEventDispatcher::filterNativeEvent(const QByteArray &eventType, void *message, qintptr *result)
将message 通过由installNativeEventFilter()设置的事件过滤器进行处理。一旦某个事件过滤器返回true ,该函数立即返回true ;否则返回false,表示应继续处理该事件。
QAbstractEventDispatcher 的子类必须对从系统接收的所有消息调用此函数,以确保与应用程序中可能使用的任何扩展兼容。事件类型eventType 取决于运行时选择的平台插件,可用于将消息强制转换为正确的类型。result 指针仅在 Windows 上使用,对应于 LRESULT 指针。
请注意,message 的类型取决于平台。详情请参阅QAbstractNativeEventFilter 。
另请参阅 installNativeEventFilter() 和QAbstractNativeEventFilter::nativeEventFilter()。
void QAbstractEventDispatcher::installNativeEventFilter(QAbstractNativeEventFilter *filterObj)
为应用程序接收的所有原生事件安装一个事件过滤器filterObj 。
事件过滤器 `filterObj ` 通过其 `nativeEventFilter()` 函数接收事件,该函数会在所有线程接收事件时被调用。
如果事件应被过滤(即在此情况下被阻止),则nativeEventFilter()函数应返回true。若要允许Qt继续正常处理,则应返回false:此时原生事件将被转换为QEvent ,并由标准的Qt XMLevent 过滤机制处理,例如QObject::installEventFilter()。
如果安装了多个事件过滤器,最后安装的过滤器将首先被激活。
注意: 此处设置的 过滤器函数接收本机消息,即 MSG 或 XEvent 结构体。
为了实现最大的可移植性,应尽可能使用QEvent 对象和QObject::installEventFilter()。
另请参阅 QObject::installEventFilter()。
[static] QAbstractEventDispatcher *QAbstractEventDispatcher::instance(QThread *thread = nullptr)
返回指向指定thread 的事件分发器对象的指针。如果thread 为nullptr ,则使用当前线程。如果指定线程不存在事件分发器,则该函数返回nullptr 。
注意:如果 Qt 在构建时未启用线程支持,则会忽略thread 参数。
[pure virtual] void QAbstractEventDispatcher::interrupt()
中断事件分发。事件分发器将尽快从processEvents()中返回。
[pure virtual] bool QAbstractEventDispatcher::processEvents(QEventLoop::ProcessEventsFlags flags)
处理与flags 匹配的待处理事件,直到没有更多事件需要处理为止。如果处理了一个事件,则返回true ;否则返回false 。
如果存在一个长时间运行的操作,并且希望通过使用QEventLoop::ExcludeUserInputEvents 标志来显示其进度,同时禁止用户输入,则此函数特别有用。
如果在flags 中设置了QEventLoop::WaitForMoreEvents 标志,则该函数的行为如下:
- 如果有可用事件,该函数会在处理完这些事件后返回。
- 如果没有可用事件,该函数将等待直至有更多事件可用,并在处理完新出现的事件后返回。
如果在flags 中未设置QEventLoop::WaitForMoreEvents 标志,且没有可用事件,则本函数将立即返回。
注意:该函数不会连续处理事件;它会在处理完所有可用事件后返回。
[pure virtual] void QAbstractEventDispatcher::registerSocketNotifier(QSocketNotifier *notifier)
将notifier 注册到事件循环中。子类必须实现此方法,以便将套接字通知器绑定到另一个事件循环中。
[since 6.8] void QAbstractEventDispatcher::registerTimer(Qt::TimerId timerId, QAbstractEventDispatcher::Duration interval, Qt::TimerType timerType, QObject *object)
为给定的object 注册一个定时器,其timerId 、interval 和timerType 参数均已指定。
该函数在 Qt 6.8 中引入。
另请参阅 unregisterTimer() 和timersForObject()。
[pure virtual] void QAbstractEventDispatcher::registerTimer(int timerId, qint64 interval, Qt::TimerType timerType, QObject *object)
为给定的object ,注册一个定时器,其timerId 、interval 和timerType 分别为指定值。
[since 6.8] Qt::TimerId QAbstractEventDispatcher::registerTimer(QAbstractEventDispatcher::Duration interval, Qt::TimerType timerType, QObject *object)
使用指定的interval 和timerType 为给定的object 注册一个定时器,并返回该定时器的ID。
这是一个重载函数。
该函数在 Qt 6.8 中引入。
[pure virtual] QList<QAbstractEventDispatcher::TimerInfo> QAbstractEventDispatcher::registeredTimers(QObject *object) const
返回object 中已注册的定时器列表。TimerInfo结构体包含timerId 、interval 和timerType 这三个成员。
另请参阅 Qt::TimerType 。
[pure virtual] int QAbstractEventDispatcher::remainingTime(int timerId)
返回给定timerId 的剩余时间(单位为毫秒)。如果计时器处于非活动状态,则返回值为-1;如果计时器已过期,则返回值为0。
另请参阅 ` Qt::TimerType`。
QAbstractEventDispatcher::Duration QAbstractEventDispatcher::remainingTime(Qt::TimerId timerId) const
返回指定timerId 对应的计时器剩余时间。如果计时器处于非活动状态,返回值将为负数。如果计时器已过期,返回值将为0。
另请参阅 Qt::TimerType 、registerTimer() 和unregisterTimer()。
void QAbstractEventDispatcher::removeNativeEventFilter(QAbstractNativeEventFilter *filter)
从该对象中移除事件过滤器filter 。如果未安装此类事件过滤器,则该请求将被忽略。
当该对象被销毁时,其所有事件过滤器都会被自动移除。
移除事件过滤器始终是安全的,即使在事件过滤器激活期间也是如此(也就是说,即使是在nativeEventFilter() 函数内部也是如此)。
另请参阅 installNativeEventFilter() 和QAbstractNativeEventFilter 。
[since 6.8] QList<QAbstractEventDispatcher::TimerInfoV2> QAbstractEventDispatcher::timersForObject(QObject *object) const
返回object 中已注册的定时器列表。TimerInfoV2 结构体包含timerId 、interval 和timerType 成员。
该函数在 Qt 6.8 中引入。
另请参阅 Qt::TimerType 、registerTimer() 以及unregisterTimer()。
[pure virtual] void QAbstractEventDispatcher::unregisterSocketNotifier(QSocketNotifier *notifier)
将notifier 从事件分发器中注销。子类必须重写此方法,以便将套接字通知器绑定到另一个事件循环中。重写时必须调用基类的实现。
[since 6.8] bool QAbstractEventDispatcher::unregisterTimer(Qt::TimerId timerId)
取消注册指定timerId 的定时器。成功时返回true ;否则返回false 。
该函数在 Qt 6.8 中引入。
另请参阅 registerTimer() 和unregisterTimers()。
[pure virtual] bool QAbstractEventDispatcher::unregisterTimer(int timerId)
取消注册指定timerId 的定时器。成功时返回true ;否则返回false 。
另请参阅 registerTimer() 和unregisterTimers()。
[pure virtual] bool QAbstractEventDispatcher::unregisterTimers(QObject *object)
注销与给定的object 关联的所有定时器。如果所有定时器均已成功移除,则返回true ;否则返回false 。
另请参阅 unregisterTimer() 和registeredTimers()。
[pure virtual] void QAbstractEventDispatcher::wakeUp()
唤醒事件循环。
注意:此函数是线程安全的。
另请参阅 awake()。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.