详解关于Qt中Event事件处理流程 |
本文标签:Qt Event 事件 Qt中Event处理流程是本文要介绍的内容,主要是来了解Event事件的处理 。在Qt/Embedded中,鼠标事件来自于触摸屏设备 。在使用select读取触摸屏设备中的数据后(即采样,压力达到一定阈值),处理些采样点后得到一个物理设备坐标点,然后用QCoreApplication的sendEvent活postEvent将其发送出去,于是Event的处理流程就开始了 。 首先,QCoreApplication::notify将event直接传递给接受者 。重新实现它,可以截取系统所有需要处理的事件 。 其次,在使用notify通知接受者处理后,可以为application的实例qApp安装一个event filter,它将处理应用程序范围内的事件 。 第三,event在经过application的处理后,到达QObject的event filter列表,为接收者者们安装event filter,将只处理发给自己的各个事件 。 第四,在经过上述处理后,event到达QObject的event函数 。该函数处理发送给自己的event,如QWidget中它按照event类型分发给自己的各个event Handler,如MouseReleaseEvent,KeyPressEvent等 。 最后,是处理不同类型event的event handler 。这也是经常使用的,它只处理自己的event 。 过程如下:
在以上处理过程中,返回true表示中止事件的处理,返回false则继续 。 父子窗体传递关系: 对于构成parent-child关系的QWidget,事件将首先传递给child,在子窗体做出ignore后将继续传递给父窗体,若是accept,将终止传 应用实例:
运行结果如下:
问题: 前两行为eventfilter中的输出结果:表示截取到了发往ListView的事件(类型为8,FocusIn事件) 。而第三行则是listView的event handler的输出,它能够处理mouse、release事件,但event filter并未捕获到它,但可以捕获到焦点的得失事件 。输出的线程号也是相同的 。 为什么event filter不能捕获两个view上的鼠标点击事件,但可以获取其它事件如FocusIn与FocusOut呢? 其中输出log的代码是:
小结:详解关于Qt中Event处理流程的内容介绍完了,希望通过本文的学习能对你有所帮助! |