Qt事件過(guò)濾實(shí)現(xiàn)點(diǎn)擊圖片的放大和縮小
本文實(shí)例為大家分享了Qt事件過(guò)濾實(shí)現(xiàn)點(diǎn)擊圖片放大和縮小的具體代碼,供大家參考,具體內(nèi)容如下
Qt事件過(guò)濾實(shí)現(xiàn)點(diǎn)擊圖片的放大查看
標(biāo)簽(空格分隔): eventFilter 事件過(guò)濾
一、項(xiàng)目?jī)?nèi)容
新建桌面應(yīng)用程序testEventFilter,類名EventFilter,基類QDialog,不勾選界面文件,通過(guò)監(jiān)視三個(gè)蝴蝶標(biāo)簽的事件達(dá)到鼠標(biāo)按下時(shí)圖片放大(縮?。┑男Ч?/p>
二、項(xiàng)目實(shí)現(xiàn)
- Eventfilter.h重寫事件過(guò)濾槽函數(shù),并添加相應(yīng)的成員數(shù)據(jù)。
#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
- 構(gòu)造函數(shù)(創(chuàng)建布局、加載圖片、設(shè)置圖片、給部件添加布局、給圖片標(biāo)簽布局安裝事件過(guò)濾,指定當(dāng)前窗體對(duì)象為監(jiān)視事件的對(duì)象)
EventFilter::EventFilter(QWidget *parent,Qt::WindowFlags f) ? ? : QDialog(parent,f) { ? ? setWindowTitle("事件過(guò)濾"); ? ? m_label1=new QLabel; ? ? m_label2=new QLabel; ? ? m_label3=new QLabel; ? ? m_stateLabel=new QLabel(QString("鼠標(biāo)按下標(biāo)志")); ? ? m_stateLabel->setAlignment(Qt::AlignHCenter); ? ?//設(shè)置標(biāo)簽居中顯示 ? ? //加載圖片 ? ? m_image1.load(QString("../fly1.png")); //圖片存在默認(rèn)Debug目錄的上一級(jí)目錄 ? ? m_image2.load(QString("../fly2.png")); ? ? m_image3.load(QString("../fly3.png")); ? ? //給標(biāo)簽設(shè)置圖片 ? ? m_label1->setPixmap(QPixmap::fromImage(m_image1)); ? ? m_label2->setPixmap(QPixmap::fromImage(m_image2)); ? ? m_label3->setPixmap(QPixmap::fromImage(m_image3)); ? ? //設(shè)置水平布局、垂直布局 ? ? 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);//調(diào)整窗口的大小 ? ? //給圖片標(biāo)簽安裝事件過(guò)濾,指定當(dāng)前窗體對(duì)象為監(jiān)視事件的對(duì)象 ? ? m_label1->installEventFilter(this); ? ? m_label2->installEventFilter(this); ? ? m_label3->installEventFilter(this); }
- 重寫事件過(guò)濾槽函數(shù),watched為被監(jiān)視對(duì)象,通過(guò)判斷watched對(duì)象是m_label1、m_label2、m_label3,判斷事件對(duì)象event的類型,再對(duì)圖片和標(biāo)簽進(jìn)行單獨(dú)的處理。
//重寫事件過(guò)濾槽函數(shù),watched為被監(jiān)視對(duì)象 bool EventFilter::eventFilter(QObject *watched, QEvent *event) { ? ? QMatrix matrix; ? ? QImage tempImage;//保存放大過(guò)后的圖片 ? ? matrix.scale(2.0,2.0);//放大兩倍 ? ? if(watched==m_label1){ ? ? ? ? //事件類型是鼠標(biāo)按下事件 ? ? ? ? if(event->type()==QEvent::MouseButtonPress){ ? ? ? ? ? ? QMouseEvent *mouseEvent=reinterpret_cast<QMouseEvent*>(event); ? ? ? ? ? ? if(mouseEvent->button()==Qt::LeftButton){ ? ? ? ? ? ? ? ? m_stateLabel->setText("鼠標(biāo)左鍵按下圖片1"); ? ? ? ? ? ? }else if(mouseEvent->button()==Qt::MidButton){ ? ? ? ? ? ? ? ? m_stateLabel->setText("鼠標(biāo)中鍵按下圖片1"); ? ? ? ? ? ? }else if(mouseEvent->button()==Qt::RightButton){ ? ? ? ? ? ? ? ? m_stateLabel->setText("鼠標(biāo)右鍵按下圖片1"); ? ? ? ? } ? ? ? ? ? ? //轉(zhuǎn)換圖片的比例 ? ? ? ? ? ? tempImage=m_image1.transformed(matrix); ? ? ? ? ? ? m_label1->setPixmap(QPixmap::fromImage(tempImage)); ? ? ? ? } ? ? ? ? //鼠標(biāo)松開事件 ? ? ? ? if(event->type()==QEvent::MouseButtonRelease){ ? ? ? ? ? ? m_stateLabel->setText("鼠標(biāo)松開圖片1"); ? ? ? ? ? ? m_label1->setPixmap(QPixmap::fromImage(m_image1));//鼠標(biāo)松開返回本身圖片的大小 ? ? ? ? } ? ? } ? ? //m_label2、m_label2的處理過(guò)程同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("鼠標(biāo)左鍵按下圖片2"); ? ? ? ? ? ? }else if(e->buttons()&Qt::MidButton){ ? ? ? ? ? ? ? ? m_stateLabel->setText("鼠標(biāo)中鍵按下圖片2"); ? ? ? ? ? ? }else if(e->buttons()&Qt::RightButton){ ? ? ? ? ? ? ? ? m_stateLabel->setText("鼠標(biāo)右鍵按下圖片2"); ? ? ? ? ? ? } ? ? ? ? ? ? tempImage=m_image2.transformed(matrix); ? ? ? ? ? ? m_label2->setPixmap(QPixmap::fromImage(tempImage)); ? ? ? ? } ? ? ? ? if(event->type()==QEvent::MouseButtonRelease){ ? ? ? ? ? ? m_stateLabel->setText("鼠標(biāo)松開圖片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("鼠標(biāo)左鍵按下圖片3"); ? ? ? ? ? ? }else if(e->buttons()&Qt::MidButton){ ? ? ? ? ? ? ? ? m_stateLabel->setText("鼠標(biāo)中鍵按下圖片3"); ? ? ? ? ? ? }else if(e->buttons()&Qt::RightButton){ ? ? ? ? ? ? ? ? m_stateLabel->setText("鼠標(biāo)右鍵按下圖片3"); ? ? ? ? ? ? } ? ? ? ? ? ? tempImage=m_image3.transformed(matrix); ? ? ? ? ? ? m_label3->setPixmap(QPixmap::fromImage(tempImage)); ? ? ? ? } ? ? ? ? if(event->type()==QEvent::MouseButtonRelease){ ? ? ? ? ? ? m_stateLabel->setText("鼠標(biāo)松開圖片3"); ? ? ? ? ? ? m_label3->setPixmap(QPixmap::fromImage(m_image3)); ? ? ? ? } ? ? } ? ? //事件交給上層對(duì)話框進(jìn)行處理 ? ? return QDialog::eventFilter(watched,event); }
三、效果
- 點(diǎn)擊任意一張圖片(鼠標(biāo)不松開)均可放大查看;
- 鼠標(biāo)松開,圖片返回原來(lái)的大小
- 標(biāo)簽m_stateLabel 提示當(dāng)前操作的圖片類型
1、初始化圖片:
2、點(diǎn)擊圖片1:
3、點(diǎn)擊圖片2:
4、鼠標(biāo)松開第二張圖片:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C++中的函數(shù)指針與函數(shù)對(duì)象的總結(jié)
以下是對(duì)C++中的函數(shù)指針與函數(shù)對(duì)象的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以參考下2013-07-07C語(yǔ)言實(shí)現(xiàn)電話簿項(xiàng)目
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)電話簿項(xiàng)目,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12C語(yǔ)言實(shí)現(xiàn)通用數(shù)據(jù)結(jié)構(gòu)之通用椎棧
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)通用數(shù)據(jù)結(jié)構(gòu)之通用椎棧,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11QT實(shí)戰(zhàn)之實(shí)現(xiàn)圖片瀏覽系統(tǒng)
這篇文章主要介紹了如何利用QT編寫一個(gè)圖片瀏覽系統(tǒng),可以支持自動(dòng)播放,左右拖動(dòng)切換,點(diǎn)擊列表切換,點(diǎn)擊按鈕切換等功能,感興趣的小伙伴可以跟隨小編一起了解一下2023-04-04Qt中CQGUI框架之陰影圓角窗口實(shí)現(xiàn)
這篇文章主要介紹了Qt中CQGUI框架之陰影圓角窗口實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03C++生成隨機(jī)浮點(diǎn)數(shù)的示例代碼
在C++11之前,我們通常采用rand函數(shù)來(lái)生成隨機(jī)數(shù),但rand函數(shù)對(duì)一些情況顯得難以處理。本文將介紹如何利用C++生成隨機(jī)浮點(diǎn)數(shù),需要的可以參考一下2022-04-04如何為Qt視圖中的文字實(shí)現(xiàn)彩虹漸變效果
這篇文章主要給大家介紹了關(guān)于如何為Qt視圖中的文字實(shí)現(xiàn)彩虹漸變效果的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用Qt具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03C++事件處理中__event與__raise關(guān)鍵字的用法講解
這篇文章主要介紹了C++事件處理中__event與__raise關(guān)鍵字的用法,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2016-01-01