Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7678593
  • 博文数量: 961
  • 博客积分: 15795
  • 博客等级: 上将
  • 技术积分: 16612
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-07 14:23
文章分类

全部博文(961)

文章存档

2016年(1)

2015年(61)

2014年(41)

2013年(51)

2012年(235)

2011年(391)

2010年(181)

分类: 嵌入式

2013-12-19 11:34:25


事件对象创建完毕后,Qt 将这个事件对象传递给 QObject 的 event() 函数。event() 函数并不直接处理事件,而是将这些事件对象按照它们不同的类型,分发给不同的事件处理器(event handler)。

 

如上所述,event() 函数主要用于事件的分发。所以,如果你希望在事件分发之前做一些操作,就可以重写这个 event() 函数了。例如,我们希望在一个 QWidget 组件中监听 tab 键的按下,那么就可以继承 QWidget,并重写它的 event() 函数,来达到这个目的:


点击(此处)折叠或打开

  1. bool CustomWidget::event(QEvent *e)
  2. {
  3.     if (e->type() == QEvent::KeyPress) {
  4.         QKeyEvent *keyEvent = static_cast<QKeyEvent *>(e);
  5.         if (keyEvent->key() == Qt::Key_Tab) {
  6.             qDebug() << "You press tab.";
  7.             return true;
  8.         }
  9.     }
  10.     return QWidget::event(e);
  11. }


CustomWidget 是一个普通的 QWidget 子类。我们重写了它的event() 函数,这个函数有一个 QEvent 对象作为参数,也就是需要转发的事件对象。函数返回值是 bool 类型。如果传入的事件已被识别并且处理,则需要返回 true,否则返回 false。如果返回值是 true,并且,该事件对象设置了 accept(),那么 Qt 会认为这个事件已经处理完毕,不会再将这个事件发送给其它对象,而是会继续处理事件队列中的下一事件。

我们可以通过使用 QEvent::type() 函数可以检查事件的实际类型,其返回值是 QEvent::Type 类型的枚举。我们处理过自己感兴趣的事件之后,可以直接返回 true,表示我们已经对此事件进行了处理;对于其它我们不关心的事件,则需要调用父类的 event() 函数继续转发,否则这个组件就只能处理我们定义的事件了。

由此可以见,event() 是一个集中处理不同类型的事件的地方。如果你不想重写一大堆事件处理器,就可以重写这个 event() 函数,通过QEvent::type() 判断不同的事件这其实暗示了 event() 函数的另外一个作用:屏蔽掉某些不需要的事件处理器。


 
返回目录:Qt学习整理

阅读(2843) | 评论(0) | 转发(1) |
0

上一篇:QT 事件

下一篇:QT 自定义事件

给主人留下些什么吧!~~