Chinaunix首页 | 论坛 | 博客
  • 博客访问: 129671
  • 博文数量: 46
  • 博客积分: 571
  • 博客等级: 准尉
  • 技术积分: 290
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-26 23:57
文章分类

全部博文(46)

文章存档

2012年(46)

我的朋友

分类: C/C++

2012-05-18 12:05:18

学习之路(21):event()

作者:豆子

转自http://devbean.blog.51cto.com/448512/230883

版权声明:原创作品,允许转载,转载时请务必以超链接形式表明文章原始出处、作者信息和本声明。否则将追究法律责任

 

今天要说的是event()函数。记得之前曾经提到过这个函数,说在事件对象创建完毕后,Qt将这个事件对象传递给QObjectevent()函数。event()函数并不直接处理事件,而是将这些事件对象按照它们不同的类型,分发给不同的事件处理器(event handler)

 

event()函数主要用于事件的分发,所以,如果你希望在事件分发之前做一些操作,那么,就需要注意这个event()函数了。为了达到这种目的,我们可以重写event()函数。例如,如果你希望在窗口中的tab键按下时将焦点移动到下一组件,而不是让具有焦点的组件处理,那么你就可以继承QWidget,并重写它的event()函数,已达到这个目的:

clip_image001bool MyWidget::event(QEvent *event) {

clip_image001        if (event->type() == QEvent::KeyPress) {

clip_image001                QKeyEvent *keyEvent = static_cast(event);

clip_image001               if (keyEvent->key() == Qt::Key_Tab) {

clip_image001                        // 处理Tab

clip_image001                        return true;

clip_image001                }

clip_image001        }

clip_image001

        return QWidget::event(event);

clip_image001}

 

event()函数接受一个QEvent对象,也就是需要这个函数进行转发的对象。为了进行转发,必定需要有一系列的类型判断,这就可以调用QEventtype()函数,其返回值是QEvent::Type类型的枚举。我们处理过自己需要的事件后,可以直接return回去,对于其他我们不关心的事件,需要调用父类的event()函数继续转发,否则这个组件就只能处理我们定义的事件了。

 

event()函数返回值是bool类型,如果传入的事件已被识别并且处理,返回true,否则返回false。如果返回值是trueQApplication会认为这个事件已经处理完毕,会继续处理事件队列中的下一事件;如果返回值是falseQApplication会尝试寻找这个事件的下一个处理函数。

 

event()函数的返回值和事件的accept()ignore()函数不同accept()ignore()函数用于不同的事件处理器之间的沟通,例如判断这一事件是否处理;event()函数的返回值主要是通知QApplicationnotify()函数是否处理下一事件。为了更加明晰这一点,我们来看看QWidgetevent()函数是如何定义的:

clip_image001bool QWidget::event(QEvent *event) {

clip_image001        switch (e->type()) {

clip_image001        case QEvent::KeyPress:

clip_image001                 keyPressEvent((QKeyEvent *)event);

clip_image001                if (!((QKeyEvent *)event)->isAccepted())

clip_image001                        return false;

clip_image001                break;

clip_image001        case QEvent::KeyRelease:

clip_image001                keyReleaseEvent((QKeyEvent *)event);

clip_image001                if (!((QKeyEvent *)event)->isAccepted())

clip_image001                        return false;

clip_image001                break;

clip_image001                // more...

clip_image001        }

clip_image001        return true;

clip_image001}

 

QWidgetevent()函数使用一个巨大的switch来判断QEventtype,并且分发给不同的事件处理函数。在事件处理函数之后,使用这个事件的isAccepted()方法,获知这个事件是不是被接受,如果没有被接受则event()函数立即返回false,否则返回true

 

另外一个必须重写event()函数的情形是有自定义事件的时候。如果你的程序中有自定义事件,则必须重写event()函数以便将自定义事件进行分发,否则你的自定义事件永远也不会被调用。关于自定义事件,我们会在以后的章节中介绍。

 

本文出自 “豆子空间” 博客,请务必保留此出处http://devbean.blog.51cto.com/448512/230883

阅读(827) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~