QT编程入门系列文章之二十一——event()

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

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

bool MyWidget::event(QEvent *event) {

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

QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);

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

// 处理Tab鍵

return true;

}

}

return QWidget::event(event);

}

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()函数以便将自定义事件进行分 发,否则你的自定义事件永远也不会被调用。关于自定义事件,我们会在以后的文章中介绍。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学习成长分享快乐

您的鼓励是我前进的不竭动力~~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值