2013-02-18 87 views
1

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

我还有虽然有些开放式的问题:

  1. 怎么样通过有关事件的窗口系统中的QApplication本身通知?
  2. 如何窗口系统了解我的小部件的内部命名,以便它可以告诉QApplication的该小工具“X”被点击,聚焦等
  3. 如果窗口系统不知道小部件名称或没有引用被点击的小部件(或任何其他类型的事件),QApplication如何确定需要通知哪个小部件。

在此先感谢您的帮助。

回答

1

在windows中,例如,QWidget只是一个带有hwnd和所有其他相关内容的普通窗口。 你甚至可以通过调用effectiveWinId()方法来获得hwnd。它使用标准的Windows消息循环来获得有关所有Windows事件的通知,您可以通过通过QCoreApplication :: setEventFilter安装适当的过滤器来获得有关所有Windows事件的通知。 但Qt还具有QML部分和其他非本土的东西,对于工作它使用依赖于“外星人小工具”

上述所有的性质一些内部簿记是真的非外国人部件和外来部件有些不同。外星人的小工具由Qt自己管理,Qtidget应该传播什么样的动作以及动作是什么,这是一个Qt工作。 Qt自4.4以来默认使用外来部件,但如果需要的话,它们可以很容易地被取消。

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

+0

除了查看可能相当想象的Qt源代码之外,还可以使用一些外部工具(如Windows上的Spy)来查看Qt应用程序中的内容。 – ixSci 2013-02-18 06:54:38

+0

谢谢ixSci – 2013-02-18 07:00:56

+1

这是相当古老的信息。由于Qt 4.4窗口小部件不是原生Windows窗口。 – 2013-02-18 08:35:31

1

在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发生事件,它就可以开始通过窗口小部件层次结构和QML分派它。

这仅适用于X11(意思是Unix和Linux)。其他平台有不同的向应用程序发送事件的方式。