• 9597阅读
  • 6回复

关于处理多个键盘按键按下的问题 [复制链接]

上一主题 下一主题
离线roywillow
 

只看楼主 倒序阅读 楼主  发表于: 2010-10-23
— 本帖被 XChinux 执行加亮操作(2010-10-23) —
最近跟朋友想一起用Item/Scene/View写个类似游戏的东西玩玩,然后发现不知道怎么处理多个按键按下去的问题。
用qDebug输出发现如果按住一个按键不松,实际上Qt似乎在轮流执行keyPressEvent和keyReleaseEvent(两个事件分别输出当前按下和释放按钮)。
但是shift、ctrl之类的按键却不会这样,按住的时候就输出press的信息,松开就输出release的信息。
所以我就感觉用个变量来记录按下和释放的状态是有些不可能了。
但是为什么shift他们就能做到呢,能不能继承出一个能处理多个按键的事件呢?

然后还一个问题,就是按键转换有延迟的问题。
比如长按一个方向键,然后突然换另外的方向键,就会发现移动的东西停了一下才继续运动……这要是在游戏中会很悲剧的……
那么到底有什么方法解决么?哪怕稍微底层一些也可以。

(听说很多windows下的游戏是使用DirectX的按键处理的,那么OpenGL能办到吗?)
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线dbzhang800

只看该作者 1楼 发表于: 2010-10-23
这个可能对你有点用

bool QKeyEvent::isAutoRepeat () const

Returns true if this event comes from an auto-repeating key; returns false if it comes from an initial key press.

Note that if the event is a multiple-key compressed event that is partly due to auto-repeat, this function could return either true or false indeterminately.
离线roywillow

只看该作者 2楼 发表于: 2010-10-23
看到那个我就想能不能让所有的键都变成非autoRepeat的啊……
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线hgpdai
只看该作者 3楼 发表于: 2011-03-27
楼主有解决办法吗?最近我也需要多个键盘按键按下的事件处理情况,楼主有好的解决方法没啊?
离线roywillow

只看该作者 4楼 发表于: 2011-03-27
竟然被挖上来了……
后来我是不得不用win api来解决,GetAsyncKeyState以及与这个类似的一些api似乎都能用来解决
但是你可能得需要一个QTimer来定时调用这个函数了
QKeyEvent似乎有个获得多个按键的函数,好像是将当前按键输出为QString
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线hgpdai
只看该作者 5楼 发表于: 2011-03-28
回 4楼(roywillow) 的帖子
主要是竟然就只搜索到你这一个贴。。。
可是我的程序不是在windows上面运行的呢,哎~~,我去找找QKeyEvent的资料吧。。谢谢楼主了。。。:)
离线flypiggy
只看该作者 6楼 发表于: 2012-01-15
关于这个问题我的办法是,在键盘消息的按下和释放事件函数中加一个判断
if(event->key() == Qt::Key_Space && !event->isAutoRepeat())
{
      //想干什么干什么
}
快速回复
限100 字节
 
上一个 下一个