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、鼠標松開第二張圖片:
以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。