本页内容

QEventLoop Class

QEventLoop 类提供了一种进入和退出事件循环的方法。更多内容...

头文件: #include <QEventLoop>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
继承自: QObject

公共类型

enum ProcessEventsFlag { AllEvents, ExcludeUserInputEvents, ExcludeSocketNotifiers, WaitForMoreEvents }
flags ProcessEventsFlags

公共函数

QEventLoop(QObject *parent = nullptr)
virtual ~QEventLoop()
int exec(QEventLoop::ProcessEventsFlags flags = AllEvents)
bool isRunning() const
bool processEvents(QEventLoop::ProcessEventsFlags flags = AllEvents)
(since 6.7) void processEvents(QEventLoop::ProcessEventsFlags flags, QDeadlineTimer deadline)
void processEvents(QEventLoop::ProcessEventsFlags flags, int maxTime)
void wakeUp()

重新实现的公共函数

virtual bool event(QEvent *event) override

公共槽

void exit(int returnCode = 0)
void quit()

详细说明

您可以随时创建一个 QEventLoop 对象,并调用其上的 `exec()` 方法来启动一个本地事件循环。在事件循环内部,调用 `exit()` 将强制 `exec()` 返回。

另请参阅 QAbstractEventDispatcher 。

成员类型文档

enum QEventLoop::ProcessEventsFlag
flags QEventLoop::ProcessEventsFlags

此枚举用于控制processEvents() 函数所处理的事件类型。

常量常量值描述
QEventLoop::AllEvents0x00所有事件。请注意,DeferredDelete 事件的处理方式特殊。更多详细信息,请参阅QObject::deleteLater()。
QEventLoop::ExcludeUserInputEvents0x01不处理用户输入事件,例如 ButtonPress 和 KeyPress。请注意,这些事件并未被丢弃;下次调用processEvents() 时,如果未设置 ExcludeUserInputEvents 标志,这些事件将会被传递。
QEventLoop::ExcludeSocketNotifiers0x02请勿处理套接字通知器事件。请注意,这些事件并未被丢弃;下次在未设置 ExcludeSocketNotifiers 标志的情况下调用processEvents() 时,它们将会被传递。
QEventLoop::WaitForMoreEvents0x04如果没有待处理事件,则等待事件。

ProcessEventsFlags 类型是QFlags<ProcessEventsFlag> 的 typedef。它存储 ProcessEventsFlag 值的按“或”运算组合。

另请参阅 processEvents()。

成员函数文档

[explicit] QEventLoop::QEventLoop(QObject *parent = nullptr)

使用给定的parent 构建一个事件循环对象。

[virtual noexcept] QEventLoop::~QEventLoop()

销毁事件循环对象。

[override virtual] bool QEventLoop::event(QEvent *event)

重写了:QObject::event(QEvent *e)。

int QEventLoop::exec(QEventLoop::ProcessEventsFlags flags = AllEvents)

进入主事件循环,并等待调用exit()。返回传递给exit()的值。

如果指定了flags ,则仅处理flags 允许的类型的事件。

必须调用此函数才能开始事件处理。主事件循环从窗口系统接收事件,并将这些事件分发给应用程序控件。

一般而言,在调用 exec() 之前,无法进行任何用户交互。作为特例,在调用 exec() 之前可以使用QMessageBox 等模态控件,因为模态控件使用自己的本地事件循环。

若要让应用程序执行空闲处理(即在无待处理事件时执行特定函数),请使用超时时间为 0ns 的QChronoTimer 。通过processEvents() 可以实现更复杂的空闲处理方案。

另请参阅 QCoreApplication::quit()、exit() 和processEvents()。

[slot] void QEventLoop::exit(int returnCode = 0)

指示事件循环以返回码退出。

调用此函数后,事件循环将从对exec()的调用中返回。exec()函数返回returnCode 。

按惯例,returnCode 的值为0表示成功,任何非零值均表示发生错误。

请注意,与同名的 C 库函数不同,该函数确实会返回给调用方——停止的是事件处理。

另请参阅 QCoreApplication::quit()、quit() 和exec()。

bool QEventLoop::isRunning() const

如果事件循环正在运行,则返回true ;否则返回false。从调用exec()开始,直到调用exit()为止,事件循环被视为正在运行。

另请参阅 exec() 和exit()。

bool QEventLoop::processEvents(QEventLoop::ProcessEventsFlags flags = AllEvents)

处理一些符合flags 条件的待处理事件。如果待处理事件已被处理,则返回true ;否则返回false 。

如果某个操作运行时间较长,且希望在不允许用户输入的情况下显示其进度(即使用ExcludeUserInputEvents 标志),此函数将特别有用。

该函数只是对QAbstractEventDispatcher::processEvents() 的封装。详情请参阅该函数的文档。

[since 6.7] void QEventLoop::processEvents(QEventLoop::ProcessEventsFlags flags, QDeadlineTimer deadline)

处理符合flags 条件的待处理事件,直到deadline 超时,或者直到没有更多事件需要处理为止,以先发生者为准。如果某个操作运行时间较长,且希望显示其进度而不允许用户输入(即使用ExcludeUserInputEvents 标志),此函数特别有用。

注:

  • 该函数不会持续处理事件;在处理完所有可用事件后,它会立即返回。
  • 指定WaitForMoreEvents 标志没有意义,将被忽略。

该函数于 Qt 6.7 中引入。

void QEventLoop::processEvents(QEventLoop::ProcessEventsFlags flags, int maxTime)

处理与flags 匹配的待处理事件,最多持续maxTime 毫秒,或者直到没有更多事件需要处理为止,以较短者为准。

等同于调用:

processEvents(flags, QDeadlineTimer(maxTime));

这是一个重载函数。

[slot] void QEventLoop::quit()

指示事件循环正常退出。

与 exit(0) 效果相同。

另请参见 QCoreApplication::quit() 和exit()。

void QEventLoop::wakeUp()

唤醒事件循环。

另请参阅 QAbstractEventDispatcher::wakeUp()。

© 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.