C++ Qt多键保持KeyReleaseEvent,KeyPressEvent未触发
我有一个程序,例如,如果我按住W然后按下D,一切正常,但是如果我然后松开D,似乎KeyPressEvent或KeyReleaseEvent不会触发W,我已经使用qDebug检查过,只要按上面指定的顺序按下和按下,任何键序列都会发生这种情况。但Renderarea似乎仍被称为C++ Qt多键保持KeyReleaseEvent,KeyPressEvent未触发,c++,qt,C++,Qt,我有一个程序,例如,如果我按住W然后按下D,一切正常,但是如果我然后松开D,似乎KeyPressEvent或KeyReleaseEvent不会触发W,我已经使用qDebug检查过,只要按上面指定的顺序按下和按下,任何键序列都会发生这种情况。但Renderarea似乎仍被称为 void RCcar::keyPressEvent(QKeyEvent* event) { //sendMove->sendData(5); if (event->key() == Qt::Key
void RCcar::keyPressEvent(QKeyEvent* event) {
//sendMove->sendData(5);
if (event->key() == Qt::Key_A) {
Renderarea->is_pressed[0] = true;
if (Renderarea->is_pressed[1]) {
sendMove->sendData(4);
}
else if (Renderarea->is_pressed[3]) {
sendMove->sendData(3);
sendMove->sendData(0);
}
else {
sendMove->sendData(0);
}
Renderarea->update();
}
if (event->key() == Qt::Key_D) {
Renderarea->is_pressed[1] = true;
if (Renderarea->is_pressed[0]) {
sendMove->sendData(4);
}
else if (Renderarea->is_pressed[3]) {
sendMove->sendData(3);
sendMove->sendData(1);
}
else {
sendMove->sendData(1);
}
Renderarea->update();
}
if (event->key() == Qt::Key_S) {
Renderarea->is_pressed[2] = true;
if (Renderarea->is_pressed[3]) {
sendMove->sendData(4);
}
else {
sendMove->sendData(2);
}
Renderarea->update();
}
if (event->key() == Qt::Key_W) {
Renderarea->is_pressed[3] = true;
if (Renderarea->is_pressed[2]) {
sendMove->sendData(4);
}
else if (Renderarea->is_pressed[0]) {
sendMove->sendData(3);
sendMove->sendData(0);
}
else if (Renderarea->is_pressed[1]) {
sendMove->sendData(3);
sendMove->sendData(1);
}
else {
sendMove->sendData(3);
}
Renderarea->update();
qDebug() << test;
}
test++;
}
void RCcar::keyReleaseEvent(QKeyEvent* event) {
qDebug() << "hahaha";
sendMove->sendData(5);
if (!event->isAutoRepeat()) {
sendMove->sendData(4);
if (event->key() == Qt::Key_A) {
Renderarea->is_pressed[0] = false;
Renderarea->update();
return;
}
if (event->key() == Qt::Key_D) {
Renderarea->is_pressed[1] = false;
Renderarea->update();
return;
}
if (event->key() == Qt::Key_S) {
Renderarea->is_pressed[2] = false;
Renderarea->update();
}
if (event->key() == Qt::Key_W) {
Renderarea->is_pressed[3] = false;
Renderarea->update();
return;
}
}
}
void RCcar::按键事件(QKeyEvent*event){
//sendMove->sendData(5);
if(event->key()==Qt::key_A){
Renderarea->按下[0]=true;
如果(渲染区域->被按下[1]){
sendMove->sendData(4);
}
否则,如果(渲染区域->被按下[3]){
sendMove->sendData(3);
sendMove->sendData(0);
}
否则{
sendMove->sendData(0);
}
Renderarea->update();
}
if(event->key()==Qt::key\u D){
Renderarea->按下[1]=真;
如果(渲染区域->被按下[0]){
sendMove->sendData(4);
}
否则,如果(渲染区域->被按下[3]){
sendMove->sendData(3);
sendMove->sendData(1);
}
否则{
sendMove->sendData(1);
}
Renderarea->update();
}
如果(事件->键()==Qt::键){
Renderarea->按下[2]=真;
如果(渲染区域->被按下[3]){
sendMove->sendData(4);
}
否则{
sendMove->sendData(2);
}
Renderarea->update();
}
if(event->key()==Qt::key\u W){
Renderarea->按下[3]=真;
如果(渲染区域->被按下[2]){
sendMove->sendData(4);
}
否则,如果(渲染区域->按[0]){
sendMove->sendData(3);
sendMove->sendData(0);
}
否则,如果(渲染区域->被按下[1]){
sendMove->sendData(3);
sendMove->sendData(1);
}
否则{
sendMove->sendData(3);
}
Renderarea->update();
qDebug()是自动重复(){
sendMove->sendData(4);
if(event->key()==Qt::key_A){
Renderarea->按下[0]=假;
Renderarea->update();
返回;
}
if(event->key()==Qt::key\u D){
Renderarea->按下[1]=假;
Renderarea->update();
返回;
}
如果(事件->键()==Qt::键){
Renderarea->按下[2]=假;
Renderarea->update();
}
if(event->key()==Qt::key\u W){
Renderarea->按下[3]=假;
Renderarea->update();
返回;
}
}
}
因此,为了清楚地说明发生了什么,如果我按下并按住w,控制台会交替打印整数测试和“哈哈哈”,如果我按下d同时按住w,它只会打印“哈哈哈”我从keypressevent中知道它正在调用Key_D,如果我停止按D,那么即使我仍按住w按钮,控制台也不会打印任何内容
谢谢为什么不使用qt快捷键?你暗中依赖键盘控制器本身,当你按下一个键时,它会重复一个键。但是当你按下另一个键时,它就会停止,如果不再次松开并按下该键,它就不会继续。这不是实现WASD风格游戏控件的正确方法,你需要这样做使用keydown和keydup事件设置方向变量,并让游戏循环或计时器执行运动。从OP中,现在删除:“我发现这解决了我的问题”