【问题标题】:Move an item in a scene Qt在 Qt 场景中移动项目
【发布时间】:2014-10-19 17:11:13
【问题描述】:

我尝试在场景中移动一个项目,为此,我使用 QKeypressEventmoveBy 两者都可以完美运行,但我想恢复“按键事件”,所以我首先决定使用一个布尔值,当按键被按下时返回 true,否则返回 false,然后创建一个新函数,如果我的布尔值为 true,我调用 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;
    }

}

谁能帮我理解我错在哪里?

【问题讨论】:

    标签: c++ qt qgraphicsitem qkeyevent


    【解决方案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();
    
    }
    

    【讨论】:

    • @Ary 感谢您接受我的回答。感谢您的评论,但在 Stack Overflow 上说“谢谢”的最佳方式是投票并接受此处写的 stackoverflow.com/help/someone-answers。你有足够的声誉来做到这一点,所以你能投票给我的答案吗?只需单击答案附近的上三角即可。也谢谢你。
    • 很抱歉,它被接受了,但我之前无法投票!完成;)
    猜你喜欢
    • 2013-01-25
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多