Qt事件过滤实现点击图片的放大和缩小

 更新时间:2022年08月18日 15:33:12   作者:喝水怪~  
这篇文章主要为大家详细介绍了Qt事件过滤实现点击图片的放大和缩小,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了Qt事件过滤实现点击图片放大和缩小的具体代码,供大家参考,具体内容如下

Qt事件过滤实现点击图片的放大查看

标签(空格分隔): eventFilter 事件过滤

一、项目内容

新建桌面应用程序testEventFilter,类名EventFilter,基类QDialog,不勾选界面文件,通过监视三个蝴蝶标签的事件达到鼠标按下时图片放大(缩小)的效果。

二、项目实现

  • Eventfilter.h重写事件过滤槽函数,并添加相应的成员数据。
#ifndef EVENTFILTER_H
#define EVENTFILTER_H
#include <QLabel>
#include <QImage>
#include <QDialog>

class EventFilter : public QDialog
{
    Q_OBJECT

public:
    EventFilter(QWidget *parent = nullptr,Qt::WindowFlags f=0);
    ~EventFilter();
public slots:
    bool eventFilter(QObject *watched, QEvent *event) override;
private:
    QLabel *m_label1;       //显示图片1
    QLabel *m_label2;       //显示图片2
    QLabel *m_label3;       //显示图片3
    QLabel *m_stateLabel;   //用于显示按下、松开的是哪一张图片
    QImage m_image1;
    QImage m_image2;
    QImage m_image3;

};
#endif // EVENTFILTER_H
  • 构造函数(创建布局、加载图片、设置图片、给部件添加布局、给图片标签布局安装事件过滤,指定当前窗体对象为监视事件的对象)
EventFilter::EventFilter(QWidget *parent,Qt::WindowFlags f)
    : QDialog(parent,f)
{
    setWindowTitle("事件过滤");
    m_label1=new QLabel;
    m_label2=new QLabel;
    m_label3=new QLabel;
    m_stateLabel=new QLabel(QString("鼠标按下标志"));
    m_stateLabel->setAlignment(Qt::AlignHCenter);    //设置标签居中显示
    //加载图片
    m_image1.load(QString("../fly1.png")); //图片存在默认Debug目录的上一级目录
    m_image2.load(QString("../fly2.png"));
    m_image3.load(QString("../fly3.png"));

    //给标签设置图片
    m_label1->setPixmap(QPixmap::fromImage(m_image1));
    m_label2->setPixmap(QPixmap::fromImage(m_image2));
    m_label3->setPixmap(QPixmap::fromImage(m_image3));

    //设置水平布局、垂直布局
    QHBoxLayout *hLayout=new QHBoxLayout;
    hLayout->addWidget(m_label1);
    hLayout->addWidget(m_label2);
    hLayout->addWidget(m_label3);

    QVBoxLayout *mainLayout=new QVBoxLayout(this);
    mainLayout->addLayout(hLayout);
    mainLayout->addWidget(m_stateLabel);

    resize(m_image2.width()*3,m_image2.height()*2);//调整窗口的大小

    //给图片标签安装事件过滤,指定当前窗体对象为监视事件的对象
    m_label1->installEventFilter(this);
    m_label2->installEventFilter(this);
    m_label3->installEventFilter(this);


}
  • 重写事件过滤槽函数,watched为被监视对象,通过判断watched对象是m_label1、m_label2、m_label3,判断事件对象event的类型,再对图片和标签进行单独的处理。
//重写事件过滤槽函数,watched为被监视对象
bool EventFilter::eventFilter(QObject *watched, QEvent *event)
{
    QMatrix matrix;
    QImage tempImage;//保存放大过后的图片
    matrix.scale(2.0,2.0);//放大两倍
    if(watched==m_label1){
        //事件类型是鼠标按下事件
        if(event->type()==QEvent::MouseButtonPress){
            QMouseEvent *mouseEvent=reinterpret_cast<QMouseEvent*>(event);
            if(mouseEvent->button()==Qt::LeftButton){
                m_stateLabel->setText("鼠标左键按下图片1");
            }else if(mouseEvent->button()==Qt::MidButton){
                m_stateLabel->setText("鼠标中键按下图片1");
            }else if(mouseEvent->button()==Qt::RightButton){
                m_stateLabel->setText("鼠标右键按下图片1");
        }
            //转换图片的比例
            tempImage=m_image1.transformed(matrix);
            m_label1->setPixmap(QPixmap::fromImage(tempImage));

        }
        //鼠标松开事件
        if(event->type()==QEvent::MouseButtonRelease){
            m_stateLabel->setText("鼠标松开图片1");
            m_label1->setPixmap(QPixmap::fromImage(m_image1));//鼠标松开返回本身图片的大小
        }
    }
    //m_label2、m_label2的处理过程同m_label1相同
    else if(watched==m_label2){
        if(event->type()==QEvent::MouseButtonPress){
            QMouseEvent *e=reinterpret_cast<QMouseEvent*>(event);
            if(e->buttons()&Qt::LeftButton){
                m_stateLabel->setText("鼠标左键按下图片2");
            }else if(e->buttons()&Qt::MidButton){
                m_stateLabel->setText("鼠标中键按下图片2");
            }else if(e->buttons()&Qt::RightButton){
                m_stateLabel->setText("鼠标右键按下图片2");
            }
            tempImage=m_image2.transformed(matrix);
            m_label2->setPixmap(QPixmap::fromImage(tempImage));
        }
        if(event->type()==QEvent::MouseButtonRelease){
            m_stateLabel->setText("鼠标松开图片2");
            m_label2->setPixmap(QPixmap::fromImage(m_image2));
        }
    }
    else if(watched==m_label3){
        if(event->type()==QEvent::MouseButtonPress){
            QMouseEvent *e=reinterpret_cast<QMouseEvent*>(event);
            if(e->buttons()&Qt::LeftButton){
                m_stateLabel->setText("鼠标左键按下图片3");
            }else if(e->buttons()&Qt::MidButton){
                m_stateLabel->setText("鼠标中键按下图片3");
            }else if(e->buttons()&Qt::RightButton){
                m_stateLabel->setText("鼠标右键按下图片3");
            }
            tempImage=m_image3.transformed(matrix);
            m_label3->setPixmap(QPixmap::fromImage(tempImage));
        }
        if(event->type()==QEvent::MouseButtonRelease){
            m_stateLabel->setText("鼠标松开图片3");
            m_label3->setPixmap(QPixmap::fromImage(m_image3));
        }
    }
    //事件交给上层对话框进行处理
    return QDialog::eventFilter(watched,event);
}

三、效果

  • 点击任意一张图片(鼠标不松开)均可放大查看;
  • 鼠标松开,图片返回原来的大小
  • 标签m_stateLabel 提示当前操作的图片类型

1、初始化图片:

2、点击图片1:

3、点击图片2:

4、鼠标松开第二张图片:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C++内存管理详解使用方式

    C++内存管理详解使用方式

    内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能更大的自由,C++菜鸟的收获则是一遍—遍的检查代码和对C++的痛恨,但内存管理在C++中无处不在,内存泄漏几乎在每个C++程序中都会发生,要想成为C++高手,内存管理这关是必须过的
    2022-04-04
  • C语言的常量,字符串,转义字符,注释你都了解吗

    C语言的常量,字符串,转义字符,注释你都了解吗

    这篇文章主要为大家详细介绍了C语言的常量,字符串,转义字符,注释,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • c++ const引用与非const引用介绍

    c++ const引用与非const引用介绍

    const引用是指向const对象的引用,可以读取ref,但不能修改所以也就有将const变量赋值给非const引用是非法的,感兴趣的朋友可以了解下,或许本文对你有所帮助
    2013-01-01
  • C语言编程中生成随机数的入门教程

    C语言编程中生成随机数的入门教程

    这篇文章主要介绍了C语言编程中生成随机数的入门教程,包括利用rand()函数来编写随机数生成器的示例,要的朋友可以参考下
    2015-12-12
  • c语言实现把文件中数据读取并存到数组中

    c语言实现把文件中数据读取并存到数组中

    下面小编就为大家带来一篇c语言实现把文件中数据读取并存到数组中。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • C语言汇编分析传递结构体指针比传递结构体变量高效的深层原因

    C语言汇编分析传递结构体指针比传递结构体变量高效的深层原因

    本文章使用的工具是vs2010,本篇文章主要讲解结构体指针作为参数传递与结构体变量作为参数传递的对比,不谈值传递与址传递的概念
    2022-10-10
  • C语言编程数据结构的栈和队列

    C语言编程数据结构的栈和队列

    本篇文章是C语言编程篇,主要为大家介绍C语言编程中的数据结构,详细的讲解了数据结构的栈和队列有需要的朋友可以借鉴参考下,希望可以有所帮助
    2021-09-09
  • 详解C++编程中用数组名作函数参数的方法

    详解C++编程中用数组名作函数参数的方法

    这篇文章主要介绍了详解C++编程中用数组名作函数参数的方法,是C++入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • 利用C++开发一个protobuf动态解析工具

    利用C++开发一个protobuf动态解析工具

    数据库中存储的protobuf序列化的内容,有时候查问题想直接解析查看内容。很多编码在网上很容易找到编解码工具,但protobuf没有找到编解码工具,可能这样的需求比较少吧,那就自己用C++实现一个,感兴趣的可以了解一下
    2023-01-01
  • C语言time.h库函数的具体用法

    C语言time.h库函数的具体用法

    C语言的time.h头文件提供了一系列的函数和工具,用于处理时间和日期相关的操作,本文主要介绍了C语言time.h库函数的具体用法,感兴趣的可以了解一下
    2023-12-12

最新评论