QT中 QEvent事件实现及应用

本项目讲述QT中event事件基本用法,有时候在项目中还是很有用的,并提供完整项目代码。

任何从QObject类派生的对象均可以通过QObject::event()方法接收事件;事件产生时,QT会创建一个合适的QEvent对象或其子对象, 然后通过调用QObject类的event()函数将这个事件对象传给特定的QObject对象或其子对象

重新实现事件函数不需要调用, 因为在main.cpp中的exe()函数中有事件循环, 事件函数只是重新实现了一下, 事件函数时虚函数都在基类中定义的,在此处只是重新改写了函数内容.

事件处理顺序:

事件过滤器eventFilter(QObject *obj, QEvent *e);----->事件分发event(QEvent *e);-------->具体事件keyPressEvent(QKeyEvent *e)等事件

一. 事件处理原理

Qt的事件处理函数都是虚函数,在基类中声明,在子类中重新实现, 这些相应的事件函数在.h文件中定义在.cpp文件中重新实现函数内容

1. 重新实现特定事件

重新实现如 mousePressEvent() ,  keyPressEvent() 和 paintEvent() 等这些Qt事先已定义的事件处理器是进行事件处理的最简单的方式

2. 重新实现QObject::event()函数

通过重新实现event()函数, 可以在事件到达特定的事件处理器之前截获并处理它们. 这种方法可以用来覆盖已定义事件的默认处理方式,也可以用来处理Qt中尚未定义特定事件处理器的事件.当重新试下event()函数时, 如果不进行事件处理, 则需要调用基类的event()事件

3. 在QObject中注册事件过滤器

如果对象使用installEventFilter()函数注册了事件过滤器,目标对象中而所有事件将先发给这个监视对象的eventFilter()函数

4. 在QApplication中注册事件过滤器

如果一个事件过滤器被注册到程序中唯一的Qapplication对象,应用程序中的所有对象里的每一个事件都会在他们被送达其他事件过滤器前, 首先抵达这个eventFilter() 函数. 它可以用来处理一些通常被QApplication忽略的事件, 如发送给失效窗口的鼠标事件等.

  1. 继承QApplication 并重新实现notify()函数

二. 具体实现代码

1. 键盘按下事件

任意事件,该方法需要把 QEvent 转换为对应的事件类型;

        QEvent  *event;

     如: QEvent 转为QKeyEvent 类型: QKeyEvent *e = static_cast(event);

bool MainWindow::event(QEvent *event)

{

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

    {

        QKeyEvent *e = static_cast(event);//把QEvent类型转为QKeyEvent

        if(e->key() == Qt::Key_B) //如果是 键盘上的B键 将不会打印键值

        {

            ui->textEdit->setText("This is key B");

            return QWidget::event(event);

        }

        qDebug()<<(char)(e->key());

        return true;

     }

    else

    {

        return QWidget::event(event);

    }

}

头文件下把事件定义为 protected  类型 

protected:

    bool eventFilter(QObject *,QEvent *); //事件过滤器

bool event(QEvent *event); //键盘按下事件

2.事件过滤器

给某个控件 安装事件过滤器

ui->setupUi(this);

ui->pushButton->installEventFilter(this);

//  ui->pushButton->setMouseTracking(true);

bool MainWindow::eventFilter(QObject *obj, QEvent *e)

{

    if(obj=this)

    {

        //类型转换 把 QEvent类型转换为QMouseEvent

        QMouseEvent *env = static_cast(e);

        //判断事件

        //if(e->type()==QEvent::MouseMove)

        if(e->type()==QEvent::MouseButtonPress)

        {

            qDebug()<x()).arg(env->y());

            return true;//不让事件继续传播

        }

    }

    return QWidget::eventFilter(obj,e);//其他事件按照原来处理

}

源码可在本博客资源下载中下载。

你可能感兴趣的:(QT系列,qt,开发语言,物联网)