c++ - 窗口系统如何通知QApplication?

标签 c++ qt qt4

我开始使用 C++ 学习 Qt,并试图弄清楚事件机制是如何工作的。我有点了解它如何在应用程序本身内工作,以及 QApplication 如何处理事件并将它们排队以处理和通知对象/小部件。

不过我还有一些悬而未决的问题:

  1. 窗口系统如何将事件通知给 QApplication 本身?
  2. 窗口系统如何知道我的小部件的内部命名,以便它可以告诉 QApplication 小部件“x”被单击、聚焦等。
  3. 如果窗口系统不知道小部件名称或没有对单击的小部件(或任何其他类型的事件)的引用,QApplication 如何确定需要通知哪个小部件。

预先感谢您的帮助。

最佳答案

在 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
tools/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 有了事件,它就可以开始通过小部件层次结构将其分派(dispatch)到 QML。

这当然只适用于 X11(即 Unix 和 Linux)。其他平台有不同的方式将事件传递给应用程序。

关于c++ - 窗口系统如何通知QApplication?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14930528/

相关文章:

c++ - 将 FFTW 库添加到 QT 项目中

qt - 使用 Qt Creator 创建信号和槽时出现错误

python - 完全透明的蒙版 -> 完全不透明的小部件

c++ - 引用重载,而不是唯一的按值传递+ std::move?

.net - 内存泄漏问题

c++ - GSL+OMP : Thread safe random number generators in C++

QT 如何删除操作菜单项

qt - Qt 维护工具中没有默认存储库

c++ - 检查/确定 QString 是否包含 html

c++ - 在 linux 中如何保证子进程在父进程退出之前被杀死?