首页 > 代码库 > Qt事务机制顺序问题

Qt事务机制顺序问题

1、整体处理流程如下:

在使用select读取触摸屏设备中的数据后(即采样,压力达到一定阈值),处理些采样点后得到一个物理设备坐标点,然后用QCoreApplication的sendEvent活postEvent将其发送出去,于是Event的处理流程就开始了。

首先,QCoreApplication::notify将event直接传递给接受者。重新实现它,可以截取系统所有需要处理的事件。

其notify声明如:bool notify(QObject *, QEvent *) Q_DECL_OVERRIDE;内容为一堆Switch case 事件

可以看见是可以重载的,故很多书上我们可以重写notify函数来达到处理事件的作用。notify后,并不是马上就会把事件传到当前视图窗口,而是经过一段漫长的旅途,最终达到我们的custonEvent函数,

这个函数也是可以重写的,我们可以自己在内部实现事件的分发,处理。或者不用重写,运用QT自己的event机制。其调用过程如下:

技术分享

其次,在使用notify通知接受者处理后,可以为application的实例qApp安装一个event filter,它将处理应用程序范围内的事件。

这个eventfiter作为全局filter,一般我们不这样用它,可作为测试时,临时设置,查看event情况。

第三,event在经过application的处理后,到达QObject的event filter列表,为接收者者们安装event filter,将只处理发给自己的各个事件。

第四,在经过上述处理后,event到达QObject的event函数。该函数处理发送给自己的event,如QWidget中它按照event类型分发给自己的各个event Handler,如MouseReleaseEvent,KeyPressEvent等。

最后,是处理不同类型event的event handler。这也是经常使用的,它只处理自己的event。

2、父子窗口流程:

事件将首先传递给子窗口,在子窗体做出ignore后将继续传递给父窗体,若是accept,将终止传递。

也就是说,子窗口先做eventfilter()-> 复制窗口的eventfilter(), 直到根节点,然后是自窗口的event()->父窗口的event(),直到根节点,最后是调用各个单独的时间处理函数KeyPressEvent等,其先后顺序也是先子窗口,再父窗口,

如果中途有任何一个重载函数accept这个event,或者在eventfilter里对这个event 返回为true,则这个event将终止传递,也就是上层窗口将接受不到这个event,就好像没有产生这个event一样。

3、所有流程图如下:

技术分享

参考:《C++ Qt GUI QT4》

   《 Qt Creator快速入门》

   http://mobile.51cto.com/iphone-287677.htm

 

Qt事务机制顺序问题