Qt如何捕获键盘事件?

RT,正在写一个小游戏,主角的移动由键盘控制。主角移动的方法(一切和主角有关的方法)在一个类中,如何在这个移动的方法里捕获键盘事件。... RT,正在写一个小游戏,主角的移动由键盘控制。主角移动的方法(一切和主角有关的方法)在一个类中,如何在这个移动的方法里捕获键盘事件。 展开
 我来答
山水阿锐
2018-07-05 · TA获得超过34.3万个赞
知道顶级答主
回答量:23.7万
采纳率:91%
帮助的人:3.2亿
展开全部
您好,Qt键盘事件属于Qt事件系统,所以事件系统中所有规则对按键事件都有效。下面关注点在按键特有的部分:
focus

一个拥有焦点(focus)的QWidget才可以接受键盘事件。有输入焦点的窗口是活动窗口或活动窗口子窗口或子子窗口等。

焦点移动的方式有以下几种:

按下Tab或Shift+Tab

注意:文本编译器(一般需要插入Tab),或者WebView(需要Tab来移动超链接焦点) 等
Qt中,需要输入Tab的地方可以用 Ctrl+Tab 或 Ctrl+Shift+Tab 替代。
点击一个QWidget
建议:只对接受文本输入的Widget启用该功能
按下键盘的快捷键
QLabel::setBuddy(), QGroupBox,以及 QTabBar 支持
使用鼠标滚轮
用户移动焦点
程序将决定被设置focus的Widget的哪一个子Widget获得焦点

注意:如果一个 Widget 已经 grabKeyboard,所有键盘事件将发送到该Widget而不是获得焦点的Widget
focusPolicy

一个QWidget获得焦点的方式受 focusPolicy 控制

Qt::TabFocus
通过Tab键获得焦点
Qt::ClickFocus
通过被单击获得焦点
Qt::StrongFocus
可通过上面两种方式获得焦点
Qt::NoFocus
不能通过上两种方式获得焦点(默认值),setFocus仍可使其获得焦点

keypress和keyrelease

首先,我们要是Widget获得焦点,一般设置focusPolicy。

然后要对按键进行响应,我们只需要直接重载:

keyPressEvent
keyReleaseEvent

注意:

对我们不处理的事件,要调用父类的相应事件处理函数。
如果widget当前没有焦点,考虑到事件转发:如果其子widget有焦点,那么该widget未处理的键盘事件将被转发过来。
有时输入焦点不在任何窗口中。这种情况发生在所有程序都是最小化的时候。这时,Windows将继续向活动窗口发送键盘消息,但是这些消息与发送给非最小化的活动窗口的键盘消息有不同的形式。

QKeyEvent

在windows下,与键盘事件有关的有8个消息:

对产生可显示字符的按键组合,Windows不仅给程序发送按键消息,而且还发送字符消息
有些键不产生字符,这些键包括shift键、功能键、光标移动键和特殊字符键如Insert和Delete。对于这些键,Windows只产生按键消息。

这些消息在Qt中只体现在QKeyEvent中。

对字符,可通过 QKeyEvent::text() 获得
其他键,QKeyEvent::key() 获得一个键值

event函数

由于 Tab 键被用来切换焦点,这使得它与众不同。

这是qwidget.cpp的event函数中的代码片段:

case QEvent::KeyPress:
{
QKeyEvent *k = (QKeyEvent *)event;
bool res = false;
if (!(k->modifiers() & (Qt::ControlModifier | Qt::AltModifier)))
{ //### Add MetaModifier?
if (k->key() == Qt::Key_Backtab || (k->key() == Qt::Key_Tab && (k->modifiers() & Qt::ShiftModifier)))
res = focusNextPrevChild(false);
else if (k->key() == Qt::Key_Tab)
res = focusNextPrevChild(true);
if (res)
break;
}
keyPressEvent(k);
}

如果我们需要处理Tab键,需要重载 event 函数。
砍侃看
2014-03-17 · TA获得超过6152个赞
知道大有可为答主
回答量:6584
采纳率:69%
帮助的人:2075万
展开全部
你可以捕获主角所在widget窗口中的键盘事件,也可以在主角身上挂事件过滤器来实现
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2014-03-17
展开全部
重写键盘事件函数(keyEvent),具体参考Qt文档
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
创作者XXGDQ4kMbU
推荐于2017-10-10 · TA获得超过1281个赞
知道小有建树答主
回答量:371
采纳率:66%
帮助的人:428万
展开全部
你可以在一个 QWidget 或者是任何一个继承于QWidget的类中捕获键盘按下事件.
void QWidget::keyPressEvent(QKeyEvent *event)
{

int keyValue = event->key();

if(keyValue & Qt::Key_Left ){
/*键盘向左按下*/

}else if(keyValue & Qt::Key_Up){
/*键盘向上按下*/

}
/*如果是QWidget的子类记得调用QWidget的keyPressEvent*/

QWidget::keyPressEvent(event);
}

手写的可能有很多错误...
追问
也就是捕获键盘时间方法所在的类的基类应该是Qwidget?
追答
是的..
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式