[Q学习]10 Qt事件系统——处理事件

来源:互联网 发布:java 双引号 加斜杠 编辑:程序博客网 时间:2024/05/30 07:12

原创文章,可以转载,转载时请以超链接形式保留本文地址、作者信息和本声明。否则将追究法律责任。

上一篇说了如何想QObject类对象投递事件,本篇则要说说接收对象如何处理事件。

先看来自于QWidget的例子,从QWidget声明文件中截取一段代码:

protected:    // Event handlers    virtual void mousePressEvent(QMouseEvent *);    virtual void mouseReleaseEvent(QMouseEvent *);    virtual void mouseDoubleClickEvent(QMouseEvent *);    virtual void mouseMoveEvent(QMouseEvent *);    virtual void keyPressEvent(QKeyEvent *);    virtual void keyReleaseEvent(QKeyEvent *);    virtual void focusInEvent(QFocusEvent *);    virtual void focusOutEvent(QFocusEvent *);    virtual void enterEvent(QEvent *);    virtual void leaveEvent(QEvent *);    virtual void paintEvent(QPaintEvent *);    virtual void moveEvent(QMoveEvent *);    virtual void resizeEvent(QResizeEvent *);    virtual void closeEvent(QCloseEvent *);

大家能看出什么?上述接口都是事件处理函数,他们共同的特点都是——虚函数。Qt的事件处理流程是按照类的继承层次,从基类一直找到最后重载的接口完成最终的处理过程。

比如,我们要做一个特殊的鼠标按键处理,则需要重载接口:

virtual void mousePressEvent(QMouseEvent *);

下面的代码来自于Qt助手。

void MyCheckBox::mousePressEvent(QMouseEvent *event){    if (event->button() == Qt::LeftButton) {        // handle left mouse button here    } else {        // pass on other buttons to base class        QCheckBox::mousePressEvent(event);    }}

更进一步,如果我们要处理的事件比较复杂,重载单一的接口无法满足要求,那我们可以重载事件处理的入口:QObject::event(),它是QObject最一般性的事件处理函数,所有的事件都会通过该接口进行传递,通过重载QObject::event()接口,我们能够获得该类完全的事件处理权,但是要注意,该接口功能强大,如果不小心会截断所有的事件处理过程,所以重载该接口最后会调用QWidget::event(event);将未处理的事件继续传递下去直至事件被处理。

bool MyWidget::event(QEvent *event){    if (event->type() == QEvent::KeyPress)    {        QKeyEvent *ke = static_cast<QKeyEvent *>(event);        if (ke->key() == Qt::Key_Tab) {            // special tab handling here            return true;        }    }    else    {        if (event->type() == MyCustomEventType)        {            MyCustomEvent *myEvent = static_cast<MyCustomEvent *>(event);            // custom event handling here            return true;        }    }    return QWidget::event(event);}

QObject::event()返回true,则事件完成处理。

总结一下:

1 Qt处理事件通过QObject的虚函数完成,用户通过重载虚函数完成自定义的处理;

2 QObject::event()可以对所有事件进行处理,功能强大,使用要小心谨慎。





0 0
原创粉丝点击