QT事件(3)

之前的文章说的都是具体事件处理函数,比如mousePressEvent(QMoseEvent *event)这种函数就是具体的事件处理函数,他是专门处理鼠标press的,那么究竟是谁去区分是鼠标事件还是键盘事件或者是其他的事件,然后再扔给具体事件处理函数去处理呢?下面我们看下一个源码大致模型:

bool QObject::event(QEvent *e)
{
    switch (e->type()) {
    case QEvent::Timer:
        timerEvent((QTimerEvent*)e);
        break;

#ifdef QT3_SUPPORT
    case QEvent::ChildInsertedRequest:
        d_func()->sendPendingChildInsertedEvents();
        break;
#endif

    case QEvent::ChildAdded:
    case QEvent::ChildPolished:
#ifdef QT3_SUPPORT
    case QEvent::ChildInserted:
#endif
    case QEvent::ChildRemoved:
        childEvent((QChildEvent*)e);
        break;
    ........
     default:
        break;
    }
}

看完上面的代码应该明白区分事件类型的函数应该就是event(QEvent *e)函数;在这个函数里面大致做的事情是判断是什么类型的事件,然后调用相对应的具体事件处理函数。这样看来event函数就像一个快递中转站,很多包裹寄来,然后会根据包裹上不同的地址进行分发包裹给不同路线的快递员。快递员就类似具体处理事件函数。说了那么多,究竟是不是这样的,下面写些测试代码来测试下就清楚了:

TestTextEdit::TestTextEdit(QWidget *parent) :
    QTextEdit(parent)
{
}

bool TestTextEdit::event(QEvent *e){
    if(e->type() == QEvent::KeyPress){
        QKeyEvent *keyevent = static_cast<QKeyEvent *>(e);
        if(keyevent->key() == Qt::Key_Space){
            qDebug() << "key_spaace!";
            return true;
        }
    }
    return QTextEdit::event(e);
}
#include "testtextedit.h"
int main(int argc, char *argv[])
{
    QApplication a(argc, argv); 
    TestTextEdit edit;
    edit.resize(320,240);
    edit.show();
    return a.exec();
}

当以上代码执行后,会产生一个QTextEdit窗口,你按下键盘上的空格键,key_spaace!将被打印出来,这说明了你重写了event函数,当产生空格键按下的事件时没让他去调用相应的具体处理事件函数,所以空格键按下这个事件是不会让窗口上的光标移动出一个空格位置的。另外,event函数的返回值是bool类型的,所以当接受并处理了我们关心的事件后应该返回true,对于不关心的事件应该调用父类同名的event函数进行转发。这里我们把上面的代码稍微改 一下,看下会发生什么事情。

bool TestTextEdit::event(QEvent *e){
    if(e->type() == QEvent::KeyPress){
        QKeyEvent *keyevent = static_cast<QKeyEvent *>(e);
        if(keyevent->key() == Qt::Key_Space){
            qDebug() << "key_spaace!";
            return true;
        }
    }
    return false;
}

把最后的return父类的同名函数改成了return false,这个时候我们会发现我们就只能响应按下空格这个事件,其他的事件都响应不了。那是因为没调用父类的同名函数。从这里我们也可以看出重写event函数可以屏蔽某些事件。但利用event函数屏蔽某些事件并不是一件很好的事,当要屏蔽某些事件时应该选用事件过滤器,这个在QT事件(4)里介绍。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值