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。