移动场景Qt中的项目

时间:2014-10-19 17:11:13

标签: c++ qt qgraphicsitem qkeyevent

我尝试在一个场景中移动一个项目,为此,我使用QKeypressEventmoveBy这两个都很完美,但我想恢复“按键事件”,所以我决定首先,使用一个布尔值,当按下键时返回true,否则返回false,然后创建一个新函数,如果我的布尔值为真,我调用moveBy,但遗憾的是它不起作用。 这就是我在file.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 个答案:

答案 0 :(得分:2)

我在这里看不到你打电话给你的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();

}