QEventLoop Class
QEventLoop 类提供了一种进入和离开事件循环的方法。更多
头文件: | #include <QEventLoop> |
CMake.QEventLoop | 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 |
公共槽
另请参阅 QAbstractEventDispatcher 。
成员类型文档
枚举 QEventLoop::ProcessEventsFlag
flags QEventLoop::ProcessEventsFlags
此枚举控制processEvents() 函数处理的事件类型。
常量 | 值 | 描述 |
---|---|---|
QEventLoop::AllEvents | 0x00 | 所有事件。请注意,DeferredDelete 事件会被特殊处理。详情请查看QObject::deleteLater() 。 |
QEventLoop::ExcludeUserInputEvents | 0x01 | 不处理用户输入事件,如 ButtonPress 和 KeyPress。请注意,这些事件不会被丢弃;下次调用processEvents() 时,如果不使用 ExcludeUserInputEvents 标志,它们将被传送。 |
QEventLoop::ExcludeSocketNotifiers | 0x02 | 不处理套接字通知器事件。请注意,这些事件不会被丢弃;下次调用processEvents() 时,它们将在不包含 ExcludeSocketNotifiers 标记的情况下被传送。 |
QEventLoop::WaitForMoreEvents | 0x04 | 如果没有待处理的事件,则等待事件。 |
ProcessEventsFlags 类型是QFlags<ProcessEventsFlag> 的类型定义。它存储了 ProcessEventsFlag 值的 OR 组合。
另请参阅 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() 期间,事件循环被视为正在运行。
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().
© 2025 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.