QT的事件过滤是经过重写函数来实现的,这个函数是:eventFilter()函数
如下是一个经过单击不一样的标签,实现标签上图片的变化的例子。
this
首先新建一个项目,基于对话框spa
头文件:code
#ifndef EVENTFILTER_H #define EVENTFILTER_H #include <QDialog> #include <QImage> #include <QLabel> #include <QEvent> class EventFilter : public QDialog { Q_OBJECT public: 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; }; #endif // EVENTFILTER_H
.cpp文件:orm
#include "eventfilter.h" #include <QGridLayout> #include <QMouseEvent> EventFilter::EventFilter(QWidget *parent) : QDialog(parent) { setWindowTitle(tr("事件过滤")); label1=new QLabel; image1.load(":/new/prefix1/image/2.png"); label1->setAlignment(Qt::AlignHCenter|Qt::AlignVCenter); label1->setPixmap(QPixmap::fromImage(image1)); label2=new QLabel; image2.load(":/new/prefix1/image/2.png"); label2->setAlignment(Qt::AlignHCenter|Qt::AlignVCenter); label2->setPixmap(QPixmap::fromImage(image2)); label3=new QLabel; image3.load(":/new/prefix1/image/2.png"); label3->setAlignment(Qt::AlignHCenter|Qt::AlignVCenter); label3->setPixmap(QPixmap::fromImage(image3)); stateLabel=new QLabel; stateLabel->setText("鼠标按下标志"); 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); } bool EventFilter::eventFilter(QObject *watched, QEvent *event) { if(watched==label1) { if(event->type()==QEvent::MouseButtonPress) { QMouseEvent *mouseEvent=(QMouseEvent *)event; { if(mouseEvent->button()==Qt::LeftButton) { stateLabel->setText("左键被按下左边图片"); } else if(mouseEvent->button()==Qt::RightButton) { stateLabel->setText("右键被按下左边图片"); } else if(mouseEvent->button()==Qt::MidButton) { stateLabel->setText("中健被按下左边图片"); } 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)); } } else if(watched==label2) { if(event->type()==QEvent::MouseButtonPress) { QMouseEvent *mouseEvent=(QMouseEvent *)event; { if(mouseEvent->button()==Qt::LeftButton) { stateLabel->setText("左键被按下中间图片"); } else if(mouseEvent->button()==Qt::RightButton) { stateLabel->setText("右键被按下中间图片"); } else if(mouseEvent->button()==Qt::MidButton) { stateLabel->setText("中健被按下中间图片"); } 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)); } } else if(watched==label3) { if(event->type()==QEvent::MouseButtonPress) { QMouseEvent *mouseEvent=(QMouseEvent *)event; { if(mouseEvent->button()==Qt::LeftButton) { stateLabel->setText("左键被按下右边图片"); } else if(mouseEvent->button()==Qt::RightButton) { stateLabel->setText("右键被按下右边图片"); } else if(mouseEvent->button()==Qt::MidButton) { stateLabel->setText("中健被按下右边图片"); } 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() { }运行后的效果:
如图,经过单击不一样的标签,标签显示不一样的大小的图片,而且最下的标签也跟着改变。这里的实现原理就是事件过滤,过滤标签上的单击事件。
事件