作用:主要可以拦截事件,过滤掉多个相同事件响应,避免处理冗余。
事件过滤器的操作:
-
首先给需要添加事件过滤器的部件注册监听对象;
对象名->installEventFilter(true); -
重写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没有鼠标事件等。 好像是只能有其中一种似的,不是很懂这些。 这些是经验所得,测试了很久才总结出来的。除非给部件单独写鼠标事件或者键盘事件。
|