首頁 > 軟體

Qt事件過濾實現點選圖片的放大和縮小

2022-08-18 18:01:12

本文範例為大家分享了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、滑鼠鬆開第二張圖片:

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com