IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> QT 事件过滤器实例 -> 正文阅读

[C++知识库]QT 事件过滤器实例

作用:主要可以拦截事件,过滤掉多个相同事件响应,避免处理冗余。

事件过滤器的操作:

  1. 首先给需要添加事件过滤器的部件注册监听对象
    对象名->installEventFilter(true);

  2. 重写eventFilter(QObject *obj, QEvent *event)函数进行处理。

头文件:

#ifndef EVENTFILTER_H
#define EVENTFILTER_H

#include <QDialog>
#include <QLabel>
#include <QImage>
#include <QEvent>
class EventFilter : public QDialog
{
    Q_OBJECT

public:
    EventFilter(QWidget *parent = 0,Qt::WindowFlags f=0);
    ~EventFilter();
public slots:
    bool eventFilter(QObject *, QEvent *);
private:
    QLabel *label1;
    QLabel *label2;
    QLabel *label3;
    QLabel *stateLabel;
    QImage Image1;
    QImage Image2;
    QImage Image3;
};

#endif // EVENTFILTER_H

源文件:

#include "eventfilter.h"
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QMouseEvent>
#include <QMatrix>
EventFilter::EventFilter(QWidget *parent,Qt::WindowFlags f)
    : QDialog(parent,f)
{
    setWindowTitle(tr("事件过滤"));
    label1 = new QLabel;
    Image1.load("../image/1.png");
    label1->setAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
    label1->setPixmap(QPixmap::fromImage(Image1));

    label2 = new QLabel;
    Image2.load("../image/2.png");
    label2->setAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
    label2->setPixmap(QPixmap::fromImage(Image2));

    label3 = new QLabel;
    Image3.load("../image/3.png");
    label3->setAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
    label3->setPixmap(QPixmap::fromImage(Image3));

    stateLabel = new QLabel(tr("鼠标按下标志"));
    stateLabel->setAlignment(Qt::AlignHCenter);

    QHBoxLayout *layout=new QHBoxLayout;
    layout->addWidget(label1);
    layout->addWidget(label2);
    layout->addWidget(label3);

    QVBoxLayout *mainLayout = new QVBoxLayout(this);
    mainLayout->addLayout(layout);
    mainLayout->addWidget(stateLabel);
    //安装对象过滤器
    label1->installEventFilter(this);
    label2->installEventFilter(this);
    label3->installEventFilter(this);
}
bool EventFilter::eventFilter(QObject *watched,QEvent *event)
{
    if(watched == label1){//首先判断当前发生事件的对象
        if(event->type() == QEvent::MouseButtonPress)//判断发生的事件类型
        {
            //将事件event转化为鼠标事件
            QMouseEvent *mouseEvent = (QMouseEvent *)event;
            if(mouseEvent->buttons()&Qt::LeftButton)
            {
                stateLabel->setText(tr("左键按下大娃"));
            }else if(mouseEvent->buttons()&Qt::MidButton)
            {
                stateLabel->setText(tr("中间键按下大娃"));
            }else if(mouseEvent->buttons()&Qt::RightButton)
            {
                stateLabel->setText(tr("右键键按下大娃"));
            }

            //放大图片
            QMatrix matrix;
            matrix.scale(1.8,1.8);
            QImage tempImage = Image1.transformed(matrix);
            label1->setPixmap(QPixmap::fromImage(tempImage));

        }
        /* 鼠标释放事件的处理,恢复图片的大小 */
        if(event->type() == QEvent::MouseButtonRelease)
        {
            stateLabel->setText(tr("鼠标键释放大娃"));
            label1->setPixmap(QPixmap::fromImage(Image1));
        }
    }
    else if(watched == label2){//首先判断当前发生事件的对象
        if(event->type() == QEvent::MouseButtonPress)//判断发生的事件类型
        {
            //将事件event转化为鼠标事件
            QMouseEvent *mouseEvent = (QMouseEvent *)event;
            if(mouseEvent->buttons()&Qt::LeftButton)
            {
                stateLabel->setText(tr("左键按下二娃"));
            }else if(mouseEvent->buttons()&Qt::MidButton)
            {
                stateLabel->setText(tr("中间键按下二娃"));
            }else if(mouseEvent->buttons()&Qt::RightButton)
            {
                stateLabel->setText(tr("右键键按下二娃"));
            }

            //放大图片
            QMatrix matrix;
            matrix.scale(1.8,1.8);
            QImage tempImage = Image2.transformed(matrix);
            label2->setPixmap(QPixmap::fromImage(tempImage));

        }
        /* 鼠标释放事件的处理,恢复图片的大小 */
        if(event->type() == QEvent::MouseButtonRelease)
        {
            stateLabel->setText(tr("鼠标键释放二娃"));
            label2->setPixmap(QPixmap::fromImage(Image2));
        }
    }
    else if(watched == label3){//首先判断当前发生事件的对象
        if(event->type() == QEvent::MouseButtonPress)//判断发生的事件类型
        {
            //将事件event转化为鼠标事件
            QMouseEvent *mouseEvent = (QMouseEvent *)event;
            if(mouseEvent->buttons()&Qt::LeftButton)
            {
                stateLabel->setText(tr("左键按下三娃"));
            }else if(mouseEvent->buttons()&Qt::MidButton)
            {
                stateLabel->setText(tr("中间键按下三娃"));
            }else if(mouseEvent->buttons()&Qt::RightButton)
            {
                stateLabel->setText(tr("右键键按下三娃"));
            }

            //放大图片
            QMatrix matrix;
            matrix.scale(1.8,1.8);
            QImage tempImage = Image3.transformed(matrix);
            label3->setPixmap(QPixmap::fromImage(tempImage));

        }
        /* 鼠标释放事件的处理,恢复图片的大小 */
        if(event->type() == QEvent::MouseButtonRelease)
        {
            stateLabel->setText(tr("鼠标键释放三娃"));
            label3->setPixmap(QPixmap::fromImage(Image3));
        }
    }

    //将事件交给上层对话框
    return QDialog::eventFilter(watched,event);
}

EventFilter::~EventFilter()
{

}

执行:

?

总结:

注意:不是所有控件都有鼠标事件或者键盘事件,例如label就没有键盘事件,如果硬是写代码进行判断,是无法操作;spinBox没有鼠标事件等。
好像是只能有其中一种似的,不是很懂这些。
这些是经验所得,测试了很久才总结出来的。除非给部件单独写鼠标事件或者键盘事件。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-22 18:17:37  更:2022-04-22 18:18:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 0:07:38-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码