event()函数接受一个QEvent对象,也就是需要这个函数进行转发的对象。为了进 行转发,必定需要有一系列的类型判断,这就可以调用QEvent的type()函数,其返回值是QEvent::Type类型的枚举。我们处理过自己需要 的事件后,可以直接return回去,对于其他我们不关心的事件,需要调用父类的event()函数继续转发,否则这个组件就只能处理我们定义的事件了。 event() 函数返回值是bool类型,如果传入的事件已被识别并且处理,返回true,否则返回false。如果返回值是true,QApplication会认为 这个事件已经处理完毕,会继续处理事件队列中的下一事件;如果返回值是false,QApplication会尝试寻找这个事件的下一个处理函数。 event() 函数的返回值和事件的accept()和ignore()函数不同。accept()和ignore()函数用于不同的事件处理器之间的沟通,例如判断这 一事件是否处理;event()函数的返回值主要是通知QApplication的notify()函数是否处理下一事件。为了更加明晰这一点,我们来看 看QWidget的event()函数是如何定义的:
bool QWidget:: event (QEvent * event ) { switch (e->type()) { case QEvent::KeyPress: keyPressEvent((QKeyEvent *) event ); if (!((QKeyEvent *) event )->isAccepted()) return false ; break ; case QEvent::KeyRelease: keyReleaseEvent((QKeyEvent *) event ); if (!((QKeyEvent *) event )->isAccepted()) return false ; break ; // more... } return true ; }QWidget的event()函数使用一个巨大的switch来判断QEvent的 type,并且分发给不同的事件处理函数。在事件处理函数之后,使用这个事件的isAccepted()方法,获知这个事件是不是被接受,如果没有被接受 则event()函数立即返回false,否则返回true。 另外一个必须重写event()函数的情形是有自定义事件的时候。如果你的 程序中有自定义事件,则必须重写event()函数以便将自定义事件进行分发,否则你的自定义事件永远也不会被调用。关于自定义事件,我们会在以后的章节 中介绍。
本文出自 “豆子空间 ” 博客,请务必保留此出处http://devbean.blog.51cto.com/448512/230883