我是靠谱客的博主 安详香菇,最近开发中收集的这篇文章主要介绍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!)
 

最后

以上就是安详香菇为你收集整理的Qt / Qt5 事件(event)机制详解的全部内容,希望文章能够帮你解决Qt / Qt5 事件(event)机制详解所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部