Qt 鍵盤事件 檢測按鍵輸入及解決無法響應方向鍵問題


1.環境

Microsoft Visual Studio 2008 + Qt4.8.6

2.UI

3.Qt按鍵事件——QKeyEvent

QKeyEvent是一個描述Qt鍵盤事件的類。當有按鍵按下或者松開的時候,按鍵事件key event將會發送消息給QWidget。Key Event包含一個特殊的接收標記,標記接收者是否處理該按鍵事件。由於Jungle想標記按下的是哪個鍵,因此需要重載按鍵事件處理函數keyPressEvent。

另一方面,鍵盤上的每個鍵,都作為Qt的一個枚舉成員,如下圖(來源:Qt官方文檔)

 因此,可以在按鍵事件處理函數keyPressEvent中識別並在界面上打印出具體的按鍵。

4.實現

建立一個QKeyBoard的Qt Widget工程,在頭文件中聲明兩個函數:

1 void keyPressEvent(QKeyEvent *event); 2 void keyReleaseEvent(QKeyEvent *event);

源文件中實現如下:

 1 void QKeyBoard::keyPressEvent(QKeyEvent *event){  2     switch(event->key()){  3         case Qt::Key_Escape:  4             this->ui.textEdit_press->append("Key_Escape Press");  5             break;  6         case Qt::Key_Tab:  7             this->ui.textEdit_press->append("Key_Tab Press");  8             break;  9         case Qt::Key_Enter: 10             this->ui.textEdit_press->append("Key_Enter Press"); 11             break; 12         case Qt::Key_Delete: 13             this->ui.textEdit_press->append("Key_Delete Press"); 14             break; 15         case Qt::Key_Space: 16             this->ui.textEdit_press->append("Key_Space Press"); 17             break; 18         case Qt::Key_Left: 19             this->ui.textEdit_press->append("Key_Left Press"); 20             break; 21         case Qt::Key_Up: 22             this->ui.textEdit_press->append("Key_Up Press"); 23             break; 24         case Qt::Key_Right: 25             this->ui.textEdit_press->append("Key_Right Press"); 26             break; 27         case Qt::Key_Down: 28             this->ui.textEdit_press->append("Key_Down Press"); 29             break; 30         /*default: 31  this->ui.textEdit->append("KeyEvent");*/
32  } 33 } 34  
35 void QKeyBoard::keyReleaseEvent(QKeyEvent *event){ 36     switch(event->key()){ 37         case Qt::Key_Escape: 38             this->ui.textEdit_release->append("Key_Escape Release"); 39             break; 40         case Qt::Key_Tab: 41             this->ui.textEdit_release->append("Key_Tab Release"); 42             break; 43         case Qt::Key_Enter: 44             this->ui.textEdit_release->append("Key_Enter Release"); 45             break; 46         case Qt::Key_Delete: 47             this->ui.textEdit_release->append("Key_Delete Release"); 48             break; 49         case Qt::Key_Space: 50             this->ui.textEdit_release->append("Key_Space Release"); 51             break; 52         case Qt::Key_Left: 53             this->ui.textEdit_release->append("Key_Left Release"); 54             break; 55         case Qt::Key_Up: 56             this->ui.textEdit_release->append("Key_Up Release"); 57             break; 58         case Qt::Key_Right: 59             this->ui.textEdit_release->append("Key_Right Release"); 60             break; 61         case Qt::Key_Down: 62             this->ui.textEdit_release->append("Key_Down Release"); 63             break; 64             /*default: 65  this->ui.textEdit->append("KeyEvent");*/
66  } 67 }

我們只處理幾個鍵(Esc、Tab、Del、Enter、Space和4個方向鍵,其余鍵類似)。

5.問題:無法響應方向鍵按下事件?

調試過程中發現,其余鍵按下后界面均能打印出對應按鍵,但方向鍵卻沒有反應?查閱Qt官方文檔后發現:

文檔描述,widget必須調用setFocusPolicy方法才能接收按鍵事件。Jungle繼續查閱setFocusPolicy:

 如上所述,對於widget,需要使能鍵盤foucs,才能處理鍵盤事件。要讓當前的widget能夠響應按鍵事件,可以通過調用函數setFocusPolicy或者在UI設計界面設置FocusPolicy。

5.效果


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM