在 X11 上,Qt 轮询 xlib (Qt4) 或 XCB (Qt5) 的事件。使用 xlib,这将是 XNextEvent() 函数和其他相关函数:
http://www.x.org/archive/X11R7.5/doc/man/man3/XMaskEvent.3.html
如果您通过 grep 查找“XNextEvent”的 Qt 源代码,您可以找到使用它的地方。例如,在 Qt 4.8.4 源代码中:
$ grep -r XNextEvent
工具/qvfb/x11keyfaker.cpp: XNextEvent(dpy, &event);
src/plugins/platforms/xlib/qxlibscreen.cpp: XNextEvent(mDisplay->nativeDisplay(), &event);
src/gui/kernel/qwidget_x11.cpp: XNextEvent(X11->display, &ev);
src/gui/kernel/qguieventdispatcher_glib.cpp: XNextEvent(X11->display, &event);
src/gui/kernel/qeventdispatcher_x11.cpp: XNextEvent(X11->display, &event);
src/gui/kernel/qapplication_x11.cpp: XNextEvent(X11->display, &nextEvent);
对于 XCB,有 xcb_wait_for_event()。
一旦 Qt 有了事件,它就可以开始通过小部件层次结构和 QML 分派它。
当然,这仅适用于 X11(即 Unix 和 Linux)。其他平台有不同的方式将事件传递给应用程序。