Qt事件處理器和事件過濾器執行個體

來源:互聯網
上載者:User

        在上一篇中我們瞭解了Qt中事件處理的方式,也提到了最常用的就是使用事件處理器和事件過濾器這兩種方法。在這一篇,我們就來看看事件處理器和事件過濾器是怎麼使用的。
一、事件處理器使用執行個體

       Qt中針對每一種常見的事件類型都提供了相應的事件處理器,我們如果想捕獲某種類型的事件並進行自訂處理,那麼只需要實現重寫這些事件處理器就行,至於常見的時間類型和對應的事件處理器如:

        在我的程式中,我使用到了滑鼠滾輪事件,主要實現的就效果就是大家比較熟悉的:用一個控制項顯示圖片,當滾動滑鼠滾輪的時候可以調整圖片顯示的大小。
        這裡我要做的就是捕獲該圖片顯示控制項的滑鼠滾輪事件,然後改寫該控制項的滑鼠滾輪滾動事件處理器。
        首先我們來看看滑鼠滾輪事件以及相應的事件處理器是啥,查看上面的圖即可知道:

        在Qt協助文檔裡面我們可以查看到如下語句“The event handler QWidget::wheelEvent() receives wheel events.”。也就是說最後事件處理器會調用wheelEvent()函數來處理該事件,因此我們需要的就是改寫wheelEvent()這個函數。

第一步:在標頭檔中申明該函數:

第二步實現wheelEvent()函數(這裡主要關注的是事件處理的架構,而不是具體的樣本,因此不去過多講解代碼細節):

void ImageWidget::wheelEvent(QWheelEvent *event){    int numDegrees = event->delta();    int num = numDegrees / 120;    if(num < 0)    {        num = 0 - num;    }    if (event->orientation() == Qt::Horizontal) {        //scrollHorizontally(numSteps);        scale *= 1.25;        resize(this->scale * this->size());    } else {        //scrollVertically(numSteps);        if(numDegrees > 0)        {            //scale *= 0.75;            resize(num * 0.75 * this->size());        }        else if(numDegrees < 0)        {            //scale *= 1.25;            resize(num * 1.25 * this->size());        }    }    event->accept();}

        到這裡這個功能就實現了,大家看看上面的標頭檔就知道這裡還實現了其它類型事件的處理,其實都是一樣的思路,找到欲處理的事件類型,找到對應的事件處理器,重寫事件處理器中處理事件的方法即可。
二、事件過濾器使用執行個體

        Qt事件模型中一項非常強大的功能就是一個QObject執行個體可以監視另一個QObject執行個體中的事件,實現方法是在目標對象中安裝事件過濾器。這裡我們接著上面的執行個體進行,為上面的圖片瀏覽器增加一個功能:在我的程式中設定了一個自動播放的按鍵,點擊按鍵後,在圖片顯示組件中就會顯示一系列圖片,就像動畫播放許多幅圖片一樣,當在上面點擊滑鼠左鍵時,就停止動畫播放而是停留在當前播放的圖片;當我再點擊滑鼠右鍵的時候,又恢複為動畫播放模式。
        首先說一下主要的頁面配置:我在一個QMainWindow中放置一個自訂的圖片顯示組件。對照上面的說明,我們很容易知道,實現該功能的方法就是在目標組件(自訂的圖片顯示組件)上註冊事件過濾器,此時的事件過濾器就是我們所說的監視對象,完成這些步驟之後,當目標組件有事件產生後,首先會傳遞給監視對象(事件過濾器)進行處理而不是該事件對應的事件處理器。所以說我們可以截獲事件進行處理。監視對象截獲目標對象的事件後就會調用自己的eventFilter()函數處理這些事件。
總結起來就兩個步驟:
第一:對目標對象調用installEventFilter()來註冊監視對象(事件過濾器);
第二:重寫監視對象的eventFilter()函數處理目標對象的事件。
我們就嚴格按照這兩步走:
首先使用installEventFilter()函數給目標對象註冊事件監聽器:

//給圖片顯示組件註冊事件過濾器imageWidget->installEventFilter(this);

然後就是重寫監視對象eventFilter()函數:

//圖片顯示組件時間過濾器處理bool PMainWindow::eventFilter(QObject *target, QEvent *event){    if(target == imageWidget)    {        qDebug("The imageWidget generate the event!");        if(event->type() == QEvent::MouseButtonPress)        {            QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);            if(mouseEvent->buttons() & Qt::LeftButton)            {                qDebug("The Left Button Event!");                killTimer(timeId);            }            else if(mouseEvent->buttons() & Qt::RightButton)            {                qDebug("The Right Button Event!");                //clickNum++;                //again();                timeId = startTimer(3000);            }            return true;        }    }    //其它組件產生的事件則交給基類處理    return QMainWindow::eventFilter(target, event);}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.