1.事件首先由Qt的ServerApplication去接收来自于外部或内部的一些行为,鼠标点击,键盘输入,时钟事件等,分析并决定送往对应的对象去处理(内部管理机制,如有机会另文分析),最后会调用bool QCoreApplication::notify ( QObject * receiver, QEvent * event ) [virtual]去处理,当然这个是虚函数,你可以在子类去重新实现它 。
2.在notify(...)中,在发给对应的接收者前,会先把消息送给QApplication。所以如果想在你界面的Widget前先处理那些事件,那么你可以给QApplication对象installEventFilter,然后在对应的eventFilter()里先把这些事件都给过一遍,该和谐的先和谐掉。
3.如果QApplication没有处理那些事件,然后就是交给事件接收对象了。在这个对象接收前,也可以为这对象加一个事件过滤器,同样是installEventFilter,不过它的调用者是事件接收者(也就是前面那个reveiver参数),而不是QApplication/QCoreApplication.
4.经过了前面两级过滤后,如果事件还没被处理(前面函数的返回值为false),那么就会进入接收者的event()函数,你可以里面根据事件的不同类型尽情处理。
5.默认event()函数根据事件类型会调用不同的事件处理函数,类似mouseEvent(),keyEvent()去分别处理他们。
以上事件处理流程,由复杂的简单。至于每一步我们写代码的时候,都会怎么去用它,可以参考http://www.cnblogs.com/smoozer/archive/2009/02/09/1386704.html 这个哥们的翻译文章。
没有评论:
发表评论