效果展示
.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;
}
仅作为个人学习记录