Qt event()

2018-10-06 20:04 更新

event()

今天要說的是 event()函數(shù)。記得之前曾經(jīng)提到過這個函數(shù),說在事件對象創(chuàng)建完畢后,Qt 將這個事件對象傳遞給 QObject的 event()函數(shù)。event()函數(shù)并不直接處理事件,而是將這些事件對象按照它們不同的類型,分發(fā)給不同的事件處理器(event handler)。

event()函數(shù)主要用于事件的分發(fā),所以,如果你希望在事件分發(fā)之前做一些操作,那么,就需要注意這個 event()函數(shù)了。為了達到這種目的,我們可以重寫 event()函數(shù)。例如,如果你希望在窗口中的tab 鍵按下時將焦點移動到下一組件,而不是讓具有焦點的組件處理,那么你就可以繼承 QWidget,并重寫它的 event()函數(shù),已達到這個目的:

bool MyWidget::event(QEvent *event) {
        if (event->type() == QEvent::KeyPress) {
                QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
                if (keyEvent->key() == Qt::Key_Tab) {
                        // 處理 Tab 鍵
                        return true;
                }
        }

        return QWidget::event(event);
}

event()函數(shù)接受一個 QEvent 對象,也就是需要這個函數(shù)進行轉(zhuǎn)發(fā)的對象。為了進行轉(zhuǎn)發(fā),必定需要有一系列的類型判斷,這就可以調(diào)用 QEvent 的 type()函數(shù),其返回值是 QEvent::Type 類型的枚舉。我們處理過自己需要的事件后,可以直接 return 回去,對于其他我們不關(guān)心的事件,需要調(diào)用父類的 event()函數(shù)繼續(xù)轉(zhuǎn)發(fā),否則這個組件就只能處理我們定義的事件了。

event()函數(shù)返回值是 bool 類型,如果傳入的事件已被識別并且處理,返回 true,否則返回 false。如果返回值是 true,QApplication 會認為這個事件已經(jīng)處理完畢,會繼續(xù)處理事件隊列中的下一事件;如果返回值是 false,QApplication 會嘗試尋找這個事件的下一個處理函數(shù)。

event()函數(shù)的返回值和事件的 accept()和 ignore()函數(shù)不同。accept()和ignore()函數(shù)用于不同的事件處理器之間的溝通,例如判斷這一事件是否處理;event()函數(shù)的返回值主要是通知QApplication 的 notify()函數(shù)是否處理下一事件。為了更加明晰這一點,我們來看看 QWidget 的event()函數(shù)是如何定義的:

bool QWidget::event(QEvent *event) {
        switch (e->type()) {
        case QEvent::KeyPress:
                 keyPressEvent((QKeyEvent *)event);
                if (!((QKeyEvent *)event)->isAccepted())
                        return false;
                break;
        case QEvent::KeyRelease:
                keyReleaseEvent((QKeyEvent *)event);
                if (!((QKeyEvent *)event)->isAccepted())
                        return false;
                break;
                // more...
        }
        return true;
}

QWidget 的 event()函數(shù)使用一個巨大的 switch 來判斷 QEvent 的 type,并且分發(fā)給不同的事件處理函數(shù)。在事件處理函數(shù)之后,使用這個事件的 isAccepted()方法,獲知這個事件是不是被接受,如果沒有被接受則 event()函數(shù)立即返回 false,否則返回 true。

另外一個必須重寫 event()函數(shù)的情形是有自定義事件的時候。如果你的程序中有自定義事件,則必須重寫 event()函數(shù)以便將自定義事件進行分發(fā),否則你的自定義事件永遠也不會被調(diào)用。關(guān)于自定義事件,我們會在以后的章節(jié)中介紹。

本文出自 “豆子空間” 博客,請務必保留此出處 http://devbean.blog.51cto.com/448512/194031

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號