Qt / Qt5 事件(event)机制详解

一、简述

事件主要分为两种:

  • 在与用户交互时发生。比如按下鼠标(mousePressEvent),敲击键盘(keyPressEvent)等。
  • 系统自动发生,比如计时器事件(timerEvent)等。

在发生事件时(比如说上面说的按下鼠标),就会产生一个 QEvent 对象(这里是QMouseEvent,为 QEvent 的子类),这个 QEvent 对象会按照下图所示的流程进行传递:

源码部分如下:

二、事件过滤器

 本质上是其他对象插入到当前对象中的间谍,该间谍专门捕获传入到当前对象的 QEvent 对象,发现该 QEvent 符合该间谍的任务要求,则进行处理,申请直接截获该 QEvent 对象,不给当前对象使用。

 主对话框拦截向 TextEdit 输入的字符。

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTextEdit>

class Widget : public QWidget
{
public:
    Widget();

protected:
    virtual bool eventFilter(QObject *obj, QEvent *event) override;

private:
    QTextEdit *textEdit;
};

#endif // WIDGET_H
#include "widget.h"
#include "ui_widget.h"

#include <QDebug>
#include <QKeyEvent>
#include <iostream>

Widget::Widget()
{
    textEdit = new QTextEdit(this);
    textEdit->setGeometry(30, 30, 300, 30);
    textEdit->installEventFilter(this);

    move(30, 30);
}

bool Widget::eventFilter(QObject *obj, QEvent *event)
{
    if (obj == textEdit)
    {
        if (event->type() == QEvent::KeyPress)
        {
            QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
            std::cout << "iostream you press " << keyEvent->key() << std::endl;
            //事件不再进行传播,拦截
            return true;
        }
        else
            return false; //继续传播
    }
    else
    {
        //当不确定是否继续传播时,按照父类的方法来处理
        //即调用父类的evenFilter函数
        return QWidget::eventFilter(obj, event);
    }
}

  三、事件分发器

 函数原型:

virtual bool event(QEvent *e)

返回 true,表明该事件本函数已经处理完了,不用劳烦老爹处理了。

返回 false,表明该事件关我 PI 事,还是交给老爹处理吧。 

如果想要老爹处理需要沟通一下,语言如下:

return QWidget::event(e);

老爹的操作就是将该事件根据类型的不同分配到不同是事件分发器中。

四、事件处理

不同的事件对象有不同的处理函数,例如鼠标抬起事件,其专用处理函数为:

virtual void mousePressEvent(QEvent *);

 五、小结

这里写图片描述

(SAW:Game Over!)
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值