Переместить элемент в сцене Qt

Я пытаюсь переместить элемент в сцене, и для этого я использую QKeypressEvent а также moveBy это работает отлично, но я бы хотел восстановить "событие нажатия клавиши", поэтому я решил сначала использовать логическое значение, которое возвращает истину, когда клавиша нажата, и ложь, если это не так, а затем создать новую функцию, где я позвонить moveBy если мой логический true, но, к сожалению, не работает. Это то, что я сделал в моем файле.cpp

Perso::Perso()
{
        right= false;
        left= false;
        up= false;
        down= false;


        moveOnMap();
        setFlag(QGraphicsItem::ItemIsFocusable);
}

void Perso::moveOnMap(){


    if (left) {
        moveBy(-10,0);
    }

    if (right) {
        moveBy(10,0);
    }

    if (up) {
        moveBy(0, -10);

    }
    if (down) { 
        moveBy(0, +10);
    }
}



void Perso::keyPressEvent(QKeyEvent *event){

    switch(event->key()){

    case Qt::Key_Up:
        up=true;
        //moveBy(0, -10);
        break;

    case Qt::Key_Right:
        right=true;
       // moveBy(10,0);
        break;

    case Qt::Key_Left:
        left=true;
       //moveBy(-10,0);
        break;

    case Qt::Key_Down:
        down= true;
        //moveBy(0, 10);
        break;
    }

    update();
}


void Perso::keyReleaseEvent(QKeyEvent *event){

    switch(event->key()){

    case Qt::Key_Up:
        up=false;
        break;

    case Qt::Key_Right:
        right= false;
        break;

    case Qt::Key_Left:
        left= false;
        break;
    case Qt::Key_Down:
        down= false;
        break;
    }

}

Кто-нибудь может помочь мне понять, где я не прав?

1 ответ

Решение

Я не вижу здесь, чтобы вы назвали свой moveOnMap(); Если в исходном коде вы не вызываете этот метод, то это нормально, что он не работает. Вы вызываете его только в конструкторе, но вы должны вызывать этот метод при каждом нажатии клавиши. Поэтому попробуйте вызвать этот метод в ваших ключевых событиях:

void Perso::keyPressEvent(QKeyEvent *event){

    switch(event->key()){

    case Qt::Key_Up:
        up=true;
        //moveBy(0, -10);
        break;

    case Qt::Key_Right:
        right=true;
       // moveBy(10,0);
        break;

    case Qt::Key_Left:
        left=true;
       //moveBy(-10,0);
        break;

    case Qt::Key_Down:
        down= true;
        //moveBy(0, 10);
        break;
    }

    moveOnMap();
    update();
}


void Perso::keyReleaseEvent(QKeyEvent *event){

    switch(event->key()){

    case Qt::Key_Up:
        up=false;
        break;

    case Qt::Key_Right:
        right= false;
        break;

    case Qt::Key_Left:
        left= false;
        break;
    case Qt::Key_Down:
        down= false;
        break;
    }
    moveOnMap();

}
Другие вопросы по тегам