当前位置:网站首页>QT 事件过滤器实例
QT 事件过滤器实例
2022-04-22 09:26:00 【GoKu~】
作用:主要可以拦截事件,过滤掉多个相同事件响应,避免处理冗余。
事件过滤器的操作:
-
首先给需要添加事件过滤器的部件注册监听对象;
对象名->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没有鼠标事件等。
好像是只能有其中一种似的,不是很懂这些。
这些是经验所得,测试了很久才总结出来的。除非给部件单独写鼠标事件或者键盘事件。
版权声明
本文为[GoKu~]所创,转载请带上原文链接,感谢
https://blog.csdn.net/qq_43517257/article/details/124326378
边栏推荐
猜你喜欢

FUTR3D:一个统一的传感器融合3D检测框架

加密压缩备份BAT脚本

Oracle 18C RAC installation grid execution script root SH error, prcr-1013: unable to start resource ora ons

LeetCode40-组合总数II

聊聊限流

运维数据该如何防泄露

从科普、医生培训及创新医械产品推广需求出发,「佰医绘」如何布局医学可视化SaaS服务?

MySQL-on duplicate key upate/case when语法使用

PHP & Laravel & 掌握 api 生成 token 的几种方式以及一些注意事项(坑)

MOS管及MOS管驱动电路案例分析-KIA MOS管
随机推荐
超越iTerm! 号称下一代终端神器,功能贼强大!
云数引领下,桑达股份2021年营收427.04亿元,同比增长33.21%
动态内存管理
好用的截图软件
FUTR3D:一个统一的传感器融合3D检测框架
Does pytorch model load the running test set and the running test set in the training process have inconsistent results?
yolov5 口罩检测flask部署
npm yarn 启动报错【已解决】
Design example of large range continuous adjustable (0 ~ 45V) low power stabilized voltage power supply based on MOSFET control
从键盘中随意输入一串字符,统计并输出该字符串中各字符(数字、大写字母、小写字母、标点符号等)各自出现的次数。用面向对像的思想实现。
ShardingSphere简介与分表使用
ANSI标准库中的time.h头文件
手动搭建hyperledger fabric v2.x 生产网络(四)创建通道,链码的生命周期
杰理之CPU性能测试【篇】
esp-01s在arduino中的开发(一)
pytorch模型加载跑测试集和训练过程中跑测试集结果不一致的问题?
杰理之复位IO维持电平使用说明【篇】
支持AUTOSAR Classic以及Adaptive平台的DEXT诊断数据库
IDEA连接成功H2数据库后什么子文件都没有
Halo 开源项目学习(一):项目启动