Qt事件过滤

效果展示
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

.h

#ifndef EVENTFILTER_H
#define EVENTFILTER_H

#include <QDialog>
#include <QLabel>
#include <QImage>
#include <QEvent>
namespace Ui {
class EventFilter;
}

class EventFilter : public QDialog
{
    Q_OBJECT

public:
    explicit EventFilter(QWidget* parent=0,Qt::WindowFlags f=0);
    ~EventFilter();

private slots:
    bool eventFilter(QObject*,QEvent*);

private:
    QLabel* label1;
    QLabel* label2;
    QLabel* label3;
    QLabel* stateLabel;
    QImage Image1;
    QImage Image2;
    QImage Image3;

private:
    Ui::EventFilter *ui;
};

#endif // EVENTFILTER_H

.cpp

#include "eventfilter.h"
#include "ui_eventfilter.h"
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QImage>
#include <QEvent>
#include <QMouseEvent>
#include <QMatrix>

EventFilter::EventFilter(QWidget* parent,Qt::WindowFlags f) :
    QDialog(parent,f),
    ui(new Ui::EventFilter)
{
    ui->setupUi(this);

    setWindowTitle("事件过滤");
    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::AlignCenter);
    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);
}
//void QObject::installEventFilter(QObject *filterObj)
//{

//}
bool EventFilter::eventFilter(QObject*watched,QEvent* event)
{
    if(watched==label1)//首先判断当前事件的发生对象
    {
        if(event->type()==QEvent::MouseButtonPress)
        {
            //将事件转化为鼠标事件
            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 tmpImg=Image1.transformed(matrix);
            label1->setPixmap(QPixmap::fromImage(tmpImg));
        }
        //鼠标释放事件的处理,恢复图片的大小
        if(event->type()==QEvent::MouseButtonRelease)
        {
            stateLabel->setText("鼠标释放左边的图片");
            label1->setPixmap(QPixmap::fromImage(Image1));
        }
    }
    if(watched==label2)//首先判断当前事件的发生对象
    {
        if(event->type()==QEvent::MouseButtonPress)
        {
            //将事件转化为鼠标事件
            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 tmpImg=Image2.transformed(matrix);
            label2->setPixmap(QPixmap::fromImage(tmpImg));
        }
        //鼠标释放事件的处理,恢复图片的大小
        if(event->type()==QEvent::MouseButtonRelease)
        {
            stateLabel->setText("鼠标释放左边的图片");
            label2->setPixmap(QPixmap::fromImage(Image2));
        }
    }
    if(watched==label3)//首先判断当前事件的发生对象
    {
        if(event->type()==QEvent::MouseButtonPress)
        {
            //将事件转化为鼠标事件
            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 tmpImg=Image3.transformed(matrix);
            label3->setPixmap(QPixmap::fromImage(tmpImg));
        }
        //鼠标释放事件的处理,恢复图片的大小
        if(event->type()==QEvent::MouseButtonRelease)
        {
            stateLabel->setText("鼠标释放左边的图片");
            label3->setPixmap(QPixmap::fromImage(Image3));
        }
    }

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

仅作为个人学习记录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值