1.不要将事件在键盘响应事件中执行,应在键盘响应事件出设置布尔型变量。
例如:
void Widget:: keyPressEvent(QKeyEvent *key)//检测键盘按下
{
Q_UNUSED(key);
if(start>0)
{
return;
}
if(!pree_PAUSE) //当没有按下暂停键时
{
if(key->key()==Key_UP)
{
pree_UP=true;
}
else if(key->key()==Key_LEFT)
{
pree_LEFT=true;
}
else if(key->key()==Key_RIGHT)
{
pree_RIGHT=true;
}
else if(key->key()==Key_DOWN)
{
pree_DOWN=true;
}
else if(key->key()==Key_SHOOT)
{
pree_SHOOT=true;
}
else if(key->key()==Key_PAUSE)
{
pree_PAUSE=true;
}
}
if(key->key()==Key_SHOOT&&pree_PAUSE)
{
pree_START=true;
}
if(key->key()==Qt::Key_M)//直接返回主界面
{
emit retu_wel_Wi();
}
}
2.通过计时器来定时调用一个执行事件的函数,在该函数中是以这些变量的值来执行的,真就执行,执行完之后要记得把变量再赋值为 false。
例如:
**计时器绑定事件:**
```cpp
connect(time2[0],&QTimer::timeout,this,&Widget::setpress);
void Widget::setpress()//施行键盘响应事件
{
if (pree_UP)
{
role1.setdire(UP);
pree_UP=false;
}
else if (pree_LEFT)
{
role1.setdire(LEFT);
pree_LEFT=false;
}else if (pree_RIGHT)
{
role1.setdire(RIGHT);
pree_RIGHT=false;
}else if (pree_DOWN)
{
role1.setdire(DOWN);
pree_DOWN=false;
}
else if(pree_SHOOT)
{
pree_SHOOT=false;
if(!role1.bulle_t.getactive()) //如果已经有子弹在外边则不发射
{ role1.shot();
QSound::play(":/music/Audio/wav/Shoot.wav");
}
}
else if(pree_START)
{
timer1[0]->start(31); //表示每31毫秒都会调用与其关联的函数。
timer1[1]->start(160);
timer1[2]->start(1000);
timer1[3]->start(60);
pree_START=false;
pree_PAUSE=false;
}
else if(pree_PAUSE)
{
timer1[0]->stop(); //表示每31毫秒都会调用与其关联的函数。
timer1[1]->stop();
timer1[2]->stop();
timer1[3]->stop();
}
}