Qt event()

2018-10-06 20:04 更新

event()

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

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

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

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

event()函數(shù)的返回值和事件的 accept()和 ignore()函數(shù)不同。accept()和ignore()函數(shù)用于不同的事件處理器之間的溝通,例如判斷這一事件是否處理;event()函數(shù)的返回值主要是通知QApplication 的 notify()函數(shù)是否處理下一事件。為了更加明晰這一點(diǎn),我們來(lái)看看 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ù)使用一個(gè)巨大的 switch 來(lái)判斷 QEvent 的 type,并且分發(fā)給不同的事件處理函數(shù)。在事件處理函數(shù)之后,使用這個(gè)事件的 isAccepted()方法,獲知這個(gè)事件是不是被接受,如果沒(méi)有被接受則 event()函數(shù)立即返回 false,否則返回 true。

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

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

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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)