♥ 學習筆記Learning 程式語言 Coding

[程式] QT─ Chap. 7 Event Processing – Reimplementing Event Handlers (1/3)

在QT當中,一個事件是QEvent子類別的一個實體(Instance)。QT能處理超過一百種類型的事件,每一種類型由個別的列舉值所定義(enum value)。例如,QEvent::type()會為滑鼠點擊回傳QEvent::MouseButtonPress。

許多事件類型需要比能儲存在一個QEvent物件裡更多的資訊。舉例來說,滑鼠點擊事件需要儲存,哪個滑鼠按鈕觸發了這個事件、並在事件發生時將滑鼠的指標定位。這些額外的資訊被儲存在QEvent的子類別,像是QMouseEvent裡。

事件(Event)會透過它們從QObject所繼承的event()函式通知物件(Object);在QWidget中已實作的事件會轉送成最常見的事件類型,像是mousePressEvent()、keyPressEvent()、and paintEvent()等。

在前面的章節中,當我們在實作主視窗程式(Main Window)、圖示編輯(IconEditor)和Plotter時,我們已經看過許多種事件處理程序了。許多其他類型的事件函式被列在QEvent的參考資料中,但是也可以自己創造自定義的事件類型,並且自行調度。

在這裡,我們將回顧兩種常見的事件類型,按鍵事件(key events)與計時事件(timer events)。

按鍵事件藉由重新實作keyPressEvent() 和keyReleaseEvent()來處理。Plotter部件重新實作keyPressEvent() ,一般來說,我們只需要重新實作keyPressEvent(),因為唯一最重要需要的按鍵組合是Ctrl、Shift 和 Alt;這些可以使用QKeyEvent::modifiers()去keyPressEvent() 裡檢查。

例如,如果我們實作了程式編輯小工具(CodeEditor widget),它可以是精簡的keyPressEvent(),並且區分成Home和Ctrl+Home兩種類型,像是這樣

 1: void CodeEditor::keyPressEvent(QKeyEvent *event)
 2: {
 3:     switch (event->key()) {
 4:     case Qt::Key_Home:
 5:         if (event->modifiers() & Qt::ControlModifier) {
 6:             goToBeginningOfDocument();
 7:         } else {
 8:             goToBeginningOfLine();
 9:         }
 10:         break;
 11:     case Qt::Key_End:
 12:         ...
 13:     default:
 14:         QWidget::keyPressEvent(event);
 15:     }
 16: }

 

Tab與Backtab(Shift+Tab)鍵是特殊的類型。

在呼叫keyPressEvent()之前,QWidget::event()會先處理,它的意義通常是往上或往下一個按鍵,這樣的行為才是我們想要的,但是在這個CodeEditor小部件中,我們更喜歡用Tab來內縮一行,所以重新實作起來像是這樣。

 

 1: bool CodeEditor::event(QEvent *event)
 2: {
 3:     if (event->type() == QEvent::KeyPress) {
 4:         QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
 5:         if (keyEvent->key() == Qt::Key_Tab) {
 6:             insertAtCurrentPosition('\t');
 7:             return true;
 8:         }
 9:     }
 10:     return QWidget::event(event);
 11: }

 

 

冏rz|||| 蕾咪累了,改天見!

突然發現這類的文章真是灌水啊!

我想要趕快寫我的歐洲壯遊日記啊啊啊啊~~~

About the author

蕾咪

蕾咪,來自台東,卻不定期旅居歐洲的工程師女孩,身兼作家、部落客、創業家等多重身份。畢業於台大電子所,曾在義大利商與美商擔任研發工程師;走訪世界後,發現對台灣有段割捨不了的愛,讓我們一起努力成為想要的自己吧!:) 合作邀稿請聯繫:ramihaha@gmail.com

Leave a Comment