QT之GUI学习笔记(十六)---event()

原文地址:http://devbean.blog.51cto.com/448512/230883

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


一 基本概念

1.event函数的作用
event函数主要用于事件的分发。
如果希望在事件分发之前做一些操作,我们可以重写event()函数来达到这个目的。
2.重写event函数的情况
(1)希望在事件分发之前做一些操作
(2)有自定义事件的时候
如果你的程序中有自定义事件,则必须重写event()函数以便将自定义事件进行分发,否则你的自定义事件永远也不会被调用。

二.代码

1.
(1)实现的功能要求:窗口中的tab键按下时将焦点移动到下一组件,而不是让具有焦点的组件处理.
解决方案:继承QWidget类,并重写它的event()函数

bool MyWidget::event(QEvent *event) {
        //如果事件是Qevent::KeyPress类型的
        if (event->type() == QEvent::KeyPress) {
                //获取按下的键
                QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);      //判断按下的键是不是tab键,如果是,才进行处理
                if (keyEvent->key() == Qt::Key_Tab) {
                        // 处理Tab鍵
                        ............
                        return true;
                }
        }

        return QWidget::event(event);
}

(2)

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

type()函数用于判断event()函数接收的QEvent对象的类型,返回值是QEvent::Type类型的枚举
(3)

  return true;

我们处理过自己需要的事件后,可以直接return回去;
其他我们不关心的事件,需要调用父类的event()函数继续转发。
如果不调用父类的event()函数,这个组件就只能处理我们定义的事件了。
(4)
event()函数返回值是bool类型

bool MyWidget::event(QEvent *event) 

若传入的事件已被识别并且处理,返回true。
如果返回值是true,QApplication会认为这个事件已经处理完毕,会继续处理事件队列中的下一事件;如果返回值是false,QApplication会尝试寻找这个事件的下一个处理函数。
2.
event()函数的返回值和事件的accept()和ignore()函数不同。
accept()和ignore()函数用于不同的事件处理器之间的沟通,例如判断这一事件是否处理;event()函数的返回值主要是通知QApplication的notify()函数是否处理下一事件。
(1)为了更加明晰这一点,我们来看看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;
}

(2)QWidget的event()函数使用switch来判断QEvent的type,并且分发给不同的事件处理函数

switch (e->type())

事件处理函数之后,使用这个事件的isAccepted()方法,获知这个事件是不是被接受,如果没有被接受则event()函数立即返回false,否则返回true。

if (!((QKeyEvent *)event)->isAccepted())
                  return false;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值