在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ C/ event()
Qt 容器和算法拾遺
自定義 model 之一
反走樣
Hello, world!
Qt 容器類之關(guān)聯(lián)存儲(chǔ)容器
QStringListModel
拖放技術(shù)之一
狀態(tài)欄
QTreeWidget
拖放技術(shù)之二
通用算法
event()
Qt 學(xué)習(xí)之路(18): Qt 標(biāo)準(zhǔn)對(duì)話框之 QInputDialog
Qt 容器類之遍歷器和隱式數(shù)據(jù)共享
QListWidget
Meta-Object 系統(tǒng)
事件接收與忽略
Qt 學(xué)習(xí)之路(tip): parent 參數(shù)
Qt 標(biāo)準(zhǔn)對(duì)話框之 QColorDialog
QPainter(續(xù))
國(guó)際化(下)
漸變填充
自定義委托
創(chuàng)建 shared library
model-view 架構(gòu)
Graphics View Framework
自定義拖放數(shù)據(jù)對(duì)象
QSortFilterProxyModel
國(guó)際化(上)
組件布局
自定義 Model 之三
事件過(guò)濾器
QDirModel
Hello, world!(續(xù))
Qt 標(biāo)準(zhǔn)對(duì)話框之 QFileDialog
自定義 model 之二
深入了解信號(hào)槽
坐標(biāo)變換
剪貼板操作
QTableWidget
QByteArray 和 QVariant
創(chuàng)建一個(gè)對(duì)話框(下)
Qt 學(xué)習(xí)之路(32): 一個(gè)簡(jiǎn)易畫板的實(shí)現(xiàn)(Graphics View)
文本文件讀寫
自定義事件
編寫跨平臺(tái)的程序
MainWindow
初探信號(hào)槽
Qt 學(xué)習(xí)之路(17): Qt 標(biāo)準(zhǔn)對(duì)話框之 QMessageBox
繪圖設(shè)備
菜單和工具條(續(xù))
二進(jìn)制文件讀寫
QString
事件(event)
菜單和工具條
QPainter
Qt 容器類之順序存儲(chǔ)容器
進(jìn)程間交互
API 文檔的使用
創(chuàng)建一個(gè)對(duì)話框(上)
一個(gè)簡(jiǎn)易畫板的實(shí)現(xiàn)(QWidget)

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

上一篇:QDirModel下一篇:QPainter