移动场景中的项目Qt

Move an item in a scene Qt

本文关键字:项目 Qt 移动      更新时间:2023-10-16

我试图在场景中移动一个项目,为此,我使用了QKeypressEventmoveBy,它们都很好地工作,但我想恢复"按键事件",所以我决定首先使用一个布尔值,当按键时返回true,不按键时返回false,然后创建一个新函数,如果我的布尔值为true,我会调用moveBy,但不幸的是,它不起作用。这是我在我的文件.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;
    }
}

有人能帮我明白我错在哪里吗?

我在这里看不到你调用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();
}