当前位置:网站首页>Qt键盘事件(一)——检测按键输入
Qt键盘事件(一)——检测按键输入
2022-07-24 16:18:00 【用户6557940】
引言
本节Jungle实现一个简单的功能:键盘按下某个键,Qt界面上显示出Jungle按下的是哪个键。
01
环境
Microsoft Visual Studio 2008 + Qt4.8.6
02
UI
03
Qt按键事件—QKeyEvent
QKeyEvent是一个描述Qt键盘事件的类。当有按键按下或者松开的时候,按键事件key event将会发送消息给QWidget。Key Event包含一个特殊的接收标记,标记接收者是否处理该按键事件。由于Jungle想标记按下的是哪个键,因此需要重载按键事件处理函数keyPressEvent。
另一方面,键盘上的每个键,都作为Qt的一个枚举成员,如下图(来源:Qt官方文档)
因此,可以在按键事件处理函数keyPressEvent中识别并在界面上打印出具体的按键。
04
实现
建立一个QKeyBoard的Qt Widget工程,在头文件中声明两个函数:
void keyPressEvent(QKeyEvent *event);
void keyReleaseEvent(QKeyEvent *event);源文件中实现如下:
void QKeyBoard::keyPressEvent(QKeyEvent *event){
switch(event->key()){
case Qt::Key_Escape:
this->ui.textEdit_press->append("Key_Escape Press");
break;
case Qt::Key_Tab:
this->ui.textEdit_press->append("Key_Tab Press");
break;
case Qt::Key_Enter:
this->ui.textEdit_press->append("Key_Enter Press");
break;
case Qt::Key_Delete:
this->ui.textEdit_press->append("Key_Delete Press");
break;
case Qt::Key_Space:
this->ui.textEdit_press->append("Key_Space Press");
break;
case Qt::Key_Left:
this->ui.textEdit_press->append("Key_Left Press");
break;
case Qt::Key_Up:
this->ui.textEdit_press->append("Key_Up Press");
break;
case Qt::Key_Right:
this->ui.textEdit_press->append("Key_Right Press");
break;
case Qt::Key_Down:
this->ui.textEdit_press->append("Key_Down Press");
break;
/*default:
this->ui.textEdit->append("KeyEvent");*/
}
}
void QKeyBoard::keyReleaseEvent(QKeyEvent *event){
switch(event->key()){
case Qt::Key_Escape:
this->ui.textEdit_release->append("Key_Escape Release");
break;
case Qt::Key_Tab:
this->ui.textEdit_release->append("Key_Tab Release");
break;
case Qt::Key_Enter:
this->ui.textEdit_release->append("Key_Enter Release");
break;
case Qt::Key_Delete:
this->ui.textEdit_release->append("Key_Delete Release");
break;
case Qt::Key_Space:
this->ui.textEdit_release->append("Key_Space Release");
break;
case Qt::Key_Left:
this->ui.textEdit_release->append("Key_Left Release");
break;
case Qt::Key_Up:
this->ui.textEdit_release->append("Key_Up Release");
break;
case Qt::Key_Right:
this->ui.textEdit_release->append("Key_Right Release");
break;
case Qt::Key_Down:
this->ui.textEdit_release->append("Key_Down Release");
break;
/*default:
this->ui.textEdit->append("KeyEvent");*/
}
}我们只处理几个键(Esc、Tab、Del、Enter、Space和4个方向键,其余键类似)。
05
问题:无法响应方向键按下事件?
调试过程中发现,其余键按下后界面均能打印出对应按键,但方向键却没有反应?查阅Qt官方文档后发现:
文档描述,widget必须调用setFocusPolicy方法才能接收按键事件。Jungle继续查阅setFocusPolicy:
如上所述,对于widget,需要使能键盘foucs,才能处理键盘事件。要让当前的widget能够响应按键事件,可以通过调用函数setFocusPolicy或者在UI设计界面设置FocusPolicy。
06
效果
边栏推荐
- 矩阵的秩和图像的秩的一些了解
- By default, the select drop-down box selects the solution ligerui that the selected attribute does not work
- Dynamics 365: explain virtual entity from 0 to 1
- With this machine learning drawing artifact, papers and blogs can get twice the result with half the effort!
- 公钥私钥传输,以及对CA证书的理解
- 多线程(基础)
- Code shoe set - mt2095 · zigzag jump
- Leetcode:162. looking for peak [two points looking for peak]
- After taking aiyouteng's medicine, Naifei's condition improved
- 【SWT】滚动容器实现商品列表样式
猜你喜欢
随机推荐
[SWT] user defined data table
OpenMP入门
After data management, the quality is still poor
[leetcode] day103 search two-dimensional matrix II
多线程(基础)
[SWT] scrolling container to realize commodity list style
'resultmap'must match' (constructor?, id*, result*, association*, collect problem solving
Leetcode:162. looking for peak [two points looking for peak]
Error 1053: the service did not respond to the start or control request in a timely fashion
Will the capital market be optimistic about TCL's folding screen story?
LaneATT
Software recommendation - website construction
Research on the efficiency of numpy array access
Dynamics crm: how to set the order of forms
How to generate complex flow chart of XMIND
3、 Set foundation ArrayList set and simple student management system
253 Conference Room II
MySQL write lock does not take effect
如何在 PHP 中防止 XSS
leetcode:162. 寻找峰值【二分寻找峰值】









