目录
在 Qt 中,当用户在桌面窗口上点击“关闭”按钮(通常是标题栏右上角的那个 ×)时,背后会经历一系列从操作系统层到 Qt 程序内部的事件传递与处理过程。下面将以一个典型的场景为例,详细描述这个事件从开始到结束的大致流程:
1. 操作系统级别的事件触发
- 用户点击了窗口标题栏上的“关闭”按钮(Windows 上是
WM_CLOSE
,X11 或 macOS 上会有各自对应的系统事件) - 操作系统的窗口管理器(Window Manager)或者系统层会捕捉到这个“要求关闭窗口”的请求,并将其转换为相应的系统消息。
示例(以 Windows 为例):
- Windows 系统层捕获到点击“关闭”按钮的动作后,会发送一个
WM_CLOSE
消息给该窗口的窗口过程(WindowProc)。
2. Qt 平台插件接收并转换为 Qt 事件
Qt 在不同平台上有不同的“平台插件”(例如 Windows 上是 qwindows.dll
、X11 上是 qxcb.so
、macOS 上是 qcocoa.dylib
等),这些插件负责把系统的原生事件转换成 Qt 可以理解的事件并投递到 Qt 的事件队列中。
主要过程:
- 平台插件接收到系统的“关闭窗口”消息。
- 平台插件会调用 Qt 内部的
QWindowSystemInterface
等接口,将此事件转换为一个QEvent::Close
或更具体的QCloseEvent
,然后投递给 Qt 的事件队列(QCoreApplication
/QGuiApplication
中的事件循环)。
3. Qt 事件循环(event loop)分发事件
Qt 程序中通常会在 main
函数里写 QApplication
(或 QGuiApplication
、QCoreApplication
)对象,然后调用其 exec()
方法,进入主事件循环。主事件循环会不断从事件队列中取出事件,并进行分发。
QCoreApplication::exec()
运行主循环,取出刚才放入队列的“关闭窗口”事件