概述
QT的事件过滤是通过重写函数来实现的,这个函数是:eventFilter()
以下是一个通过单击不同的标签,实现标签上图片的变化的例子。
首先新建一个项目,基于对话框
头文件:
#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文件:
#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()
{
}
运行后的效果:
如图,通过单击不同的标签,标签显示不同的大小的图片,并且最下的标签也跟着改变。这里的实现原理就是事件过滤,过滤标签上的单击事件。
转载于:https://my.oschina.net/u/2505464/blog/542361
最后
以上就是专一枕头为你收集整理的自学QT之事件过滤的全部内容,希望文章能够帮你解决自学QT之事件过滤所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复