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

窗口系统如何通知QApplication? 我开始用C++学习QT,我试图弄清楚事件机制是如何工作的。我有点了解它在应用程序本身中是如何工作的,以及QApplication是如何处理事件并将其排队以处理和通知对象/小部件的,c++,qt,qt4,C++,Qt,Qt4,不过,我还有一些悬而未决的问题: 窗口系统如何通知QApplication自身事件 窗口系统如何知道我的小部件的内部命名,以便告诉QApplication小部件“x”被点击、聚焦等 如果窗口系统不知道小部件名称或没有对单击的小部件(或任何其他类型的事件)的引用,QApplication如何确定需要通知哪个小部件 提前感谢您的帮助。在X11上,Qt轮询xlib(Qt4)或XCB(Qt5)以了解事件。对于xlib,这将是XNextEvent()函数和其他相关函数: 如果您浏览“XNextEvent

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

  • 窗口系统如何通知QApplication自身事件
  • 窗口系统如何知道我的小部件的内部命名,以便告诉QApplication小部件“x”被点击、聚焦等
  • 如果窗口系统不知道小部件名称或没有对单击的小部件(或任何其他类型的事件)的引用,QApplication如何确定需要通知哪个小部件
  • 提前感谢您的帮助。

    在X11上,Qt轮询xlib(Qt4)或XCB(Qt5)以了解事件。对于xlib,这将是XNextEvent()函数和其他相关函数:

    如果您浏览“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); $grep-r XNextEvent 工具/qvfb/x11keyfaker.cpp:XNextEvent(dpy和事件); src/plugins/platforms/xlib/qxlibscreen.cpp:XNextEvent(mDisplay->nativeDisplay(),&event); src/gui/kernel/qwidget_x11.cpp:XNextEvent(x11->display,&ev); src/gui/kernel/qguieventdispatcher\u glib.cpp:XNextEvent(X11->display,&event); src/gui/kernel/qeventdispatcher_x11.cpp:XNextEvent(x11->显示和事件); src/gui/kernel/qapplication_x11.cpp:XNextEvent(x11->display,&nextEvent); 对于XCB,存在XCB_wait_for_event()

    一旦Qt拥有该事件,它就可以开始通过小部件层次结构将其分派到QML


    当然,这只适用于X11(意味着Unix和Linux)。其他平台有不同的方式向应用程序传递事件。

    例如,在windows中,QWidget只是一个包含hwnd和所有其他相关内容的普通窗口。 您甚至可以通过调用effectiveWinId()方法来获取hwnd。它使用标准的Windows消息循环来获得有关所有Windows事件的通知,您可以通过QCoreApplication::setEventFilter安装适当的过滤器来获得这些信息。 但是Qt也有QML部分和其他非本地的东西,为了实现这一点,它使用了一些内部簿记,这取决于“外来小部件”的性质

    对于非外来小部件,上述所有情况都是正确的,而外来小部件有所不同。外来小部件由Qt本身管理,它是一项Qt任务,用于确定应该传播什么QWidget操作以及该操作是什么。从4.4开始,Qt默认使用外来小部件,但如果需要,它们可以很容易地进行初始化


    其他操作系统在实现上有所不同,但想法是相同的。

    除了查看Qt的来源(这可能是很有远见的),您还可以使用一些外部工具,如Spy(在Windows上)来查看Qt应用程序中的内容。这是非常旧的信息。因为Qt4.4小部件不是本机Windows。Roku你有证据吗??也许是链接?我认为情况正好相反。@Roku,尝试使用spy-on-windowsqt应用程序,你会发现QWidgets都是有手柄的窗口。除了Qt的某些部分(例如打开\保存对话框)和所有Qt Util(助手、Createor等)都基于外来小部件之外,我没有看到任何默认外来小部件的证据。所以我会更新我的答案