QT 让键盘方向键控制按键移动 怎么做,请给出代码

QT 让键盘方向键控制按键移动 怎么做,请给出代码,第1张

void game::key(QKeyEvent *event){ switch(event->key())//我想让按键事件触发按键上下移动 { case Qt::Key_Up:ui->chongzi->move(ui->chongzi->pos().x(),ui->chongzi->pos().y()+10)breakcase Qt::Key_Down: ui->chongzi->move(ui->chongzi->pos().x(),ui->chongzi->pos().y()-10)breakcase Qt::Key_Right: ui->chongzi->move(ui->chongzi->pos().x()+10,ui->chongzi->pos().y())breakcase Qt::Key_Left: ui->chongzi->move(ui->chongzi->pos().x()-10,ui->chongzi->pos().y())break}}

您好,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 函数。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7958147.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-12
下一篇 2023-04-12

发表评论

登录后才能评论

评论列表(0条)

保存