1.实际开发遇到的场景:
我需要在某个按键按下时实现某个操作,在按键再次按下时取消这个操作,之后按键的操作重复上面的步骤。
开始未考虑太多,实现代码如下:
void QKeyPressEvent(QKeyEvent *event)
{
switch(event->key())
{
case Qt::Key_F2:
if(m_bIsF2PressFlag)//m_bIsF2PressFlag为全局变量,默认为true
{
//do something
//使用某个操作
m_bIsF2PressFlag = false;
}
else
{
//do something
//取消该操作
m_bIsF2PressFlag = true;
}
break;
//...
}
}
我在QKeyPressEvent中case该按键时,实现了这个需求,使用一个标志位m_bIsF2PressFlag 用于区分时实现还是取消操作。但是,这样子,存在一个问题:在按键长按时,会一直响应该按键。
2.解决方法:
出现这样现象的原因是,在长按时event自动setAutoRepeat(true),这样会导致一直响应该按键的键盘事件。庆幸的是,我们可以通过event的isAutoRepeat()方法来得到这个状态,至此,我们得到了解决问题的方法。附上最后解决问题后的代码:
void QKeyPressEvent(QKeyEvent *event)
{
switch(event->key())
{
case Qt::Key_F2:
if(event->isAutoRepeat())
return;
if(m_bIsF2PressFlag)//m_bIsF2PressFlag为全局变量,默认为true
{
//do something
//使用某个操作
m_bIsF2PressFlag = false;
}
else
{
//do something
//取消该操作
m_bIsF2PressFlag = true;
}
break;
//...
}
}