QT5.7 实战项目 事件过滤 实现动态图片按钮效果

1.eventfilter.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);
    ~EventFilter();
public slots:
    bool eventFilter(QObject *, QEvent *);

private:
    QLabel *label1;
    QLabel *label2;
    QLabel *label3;

    QLabel *stateLabel;

    QImage Image1;
    QImage Image2;
    QImage Image3;
    Ui::EventFilter *ui;
};

#endif // EVENTFILTER_H

2.eventfilter.cpp

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

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

    label3=new QLabel;
    Image3.load("C:/Qt/qt_salman/eventfilter/image/3.png");
    label3->setAlignment(Qt::AlignHCenter|Qt::AlignCenter);
    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);

    ui->setupUi(this);
}

EventFilter::~EventFilter()
{
    delete ui;
}
bool EventFilter::eventFilter(QObject *watched, QEvent *event)
{
    if(watched==label1)  //首先判断当前发生事件的对象
    {
        if(event->type()==QEvent::MouseButtonPress)  //有事件发生
        {
            QMouseEvent *mouseEvent=(QMouseEvent *)event; //将事件event转化为鼠标事件
            if(mouseEvent->button()&Qt::LeftButton)
            {
                stateLabel->setText(tr("左键按下左边图片"));
            }
            else if(mouseEvent->button()&Qt::MidButton)
            {
                stateLabel->setText(tr("中键按下左边图片"));
            }
            else if(mouseEvent->button()&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(tr("鼠标释放左边图片"));
            label1->setPixmap(QPixmap::fromImage(Image1));
        }
    }

    else if(watched==label2)
    {
        if(event->type()==QEvent::MouseButtonPress)
        {
            QMouseEvent *mouseEvent=(QMouseEvent *)event;
            if(mouseEvent->button()&Qt::LeftButton)
            {
                stateLabel->setText(tr("左键按下中间图片"));
            }
            else if(mouseEvent->button()&Qt::MidButton)
            {
                stateLabel->setText(tr("中键按下中间图片"));
            }
            else if(mouseEvent->button()&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(tr("鼠标释放中间图片"));
            label2->setPixmap(QPixmap::fromImage(Image2));
       }
    }
    else 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->button()&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(tr("鼠标释放右边图片"));
            label3->setPixmap(QPixmap::fromImage(Image3));
        }

    }
    return QDialog::eventFilter(watched,event);  //可以解除已安装的事件过滤器


}


3.main.cpp

#include "eventfilter.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    EventFilter w;
    w.show();

    return a.exec();
}
发布了177 篇原创文章 · 获赞 5 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/aa804738534/article/details/104733573
今日推荐