Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt多键保持KeyReleaseEvent,KeyPressEvent未触发_C++_Qt - Fatal编程技术网

C++ Qt多键保持KeyReleaseEvent,KeyPressEvent未触发

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

我有一个程序,例如,如果我按住W然后按下D,一切正常,但是如果我然后松开D,似乎KeyPressEvent或KeyReleaseEvent不会触发W,我已经使用qDebug检查过,只要按上面指定的顺序按下和按下,任何键序列都会发生这种情况。但Renderarea似乎仍被称为

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中,现在删除:“我发现这解决了我的问题”