赞
踩
从http://www.mamicode.com/info-detail-1110145.html这篇文章介绍中,了解了QT关于事件处理的一些知识,仔细研究一下,我觉着原文有点问题,现整理如下:
一、首先介绍QT中的几个类
1、基类QObject
这个类中有两个虚函数
virtual bool event(QEvent *);
virtual bool eventFilter(QObject * /* watched */, QEvent * /* event*/);
2、QApplication。
这个类是从QObject继承过来,所以也有上述两个函数,并且也定义了一个自己的虚函数
virtual bool notify(QObject*receiver, QEvent *e);
注:这个函数实际上是在QCoreApplication这个类中定义的,QApplication从QCoreApplication继承过来,QCoreApplication从QObject继承过来。
二、事件处理过程
第一,当事件发生时,QApplication定义的对象a会收到该事件的发生。调用a的notify函数,这个函数根据recerver将事件e发送的程序中的具体的某一个控件(对象)。
第二,如果对对象a安装了事件过滤器(a.installEventFilter(&a);),则会执行eventFilter函数来过滤事件。注意:这里一旦过滤掉某一个事件,对整个应用程序有效,也就是所有的控件都不会收到该事件。
第三,调用某一个控件(由notify 函数中的receiver确定哪一个控件)的event函数来处理。这里仅仅将事件分类,比如该事件是按键事件或者鼠标事件等等;
第四,如果该控件安装了事件过滤器(obj_x.installEventFilter(&obj_x);),则会执行该控件的eventFilter函数来过滤事件。注意:这里的过滤和第二步的过滤的效果不一样,这里的过滤只对该控件有效,如果该控件中有子控件,则对子控件也有效,比如该控件是一个Qwidget的对象,则该Widget中的所有的Qlabel、QpushButton等控件都不会收到本次事件。
第五,上述确定好某一个事件后,会调用某一个控件的具体的事件处理函数,比如按键按压的keyPressEvent函数。Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。