2014-06-27 51 views
1

在這個程序中,我已經建立了一個QPropertyanimation並添加到它我的項目和pos()財產。 我覆蓋KeyPressEvent。並使用鍵組成Ĵ˚F的z項目去forward,去backjumpqpropretyanimation最好使用

根據項目跳躍應該下降的重力。爲此我稱down函數。但只是一次跳的項目不會下降。我還有另一個問題:當第一次按下jf(向前和向後)項目動畫令人滿意時,但是對於下一次項目前進並返回所有場景。

我的意思是它應該動畫例如​​40像素,但它動畫800像素。

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit MainWindow(QWidget *parent = 0); 
    QPoint start; 
    QPoint end; 
    ~MainWindow(); 
private: 
    QGraphicsView* view; 
    QGraphicsScene* scene; 
    void keyPressEvent(QKeyEvent* k); 
    MyQgraphicsObject* m; 
    QPropertyAnimation* pr; 
    QElapsedTimer* timer; 
    int f; 
    int u; 
    int b; 
    void forward(); 
    void up(); 
    void back(); 
    void down(); 
}; 

MainWindow::MainWindow(QWidget *parent) : 
     QMainWindow(parent) 
{ 
    view=new QGraphicsView; 
    scene=new QGraphicsScene; 
    m=new MyQgraphicsObject; 
    pr=new QPropertyAnimation(m,"pos"); 
    view->setScene(scene); 
    view->resize(800,800); 
    view->setFixedSize(800,800); 
    setCentralWidget(view); 
    scene->addItem(m); 
    start= QPoint(0,0); 
    f=30; 
    u=-30; 
    b=-30; 
} 

void MainWindow::keyPressEvent(QKeyEvent *k) 
{ 
    switch (k->key()) { 
    case Qt::Key_J: { 
     forward(); 
     break; 
     } 
    case Qt::Key_Z: { 
     up(); 
     down(); 
     break; 
     } 
    case Qt::Key_F: { 
     back(); 
     break; 
     } 
    default: 
     break; 
    } 
} 

void MainWindow::forward() 
{ 
    end.setX(f); 
    pr->setEndValue(end); 
    pr->setDuration(1000); 
    pr->setEasingCurve(QEasingCurve::Linear); 
    pr->start(); 
    f+=40; 
} 

void MainWindow::up() 
{ 
    end.setY(u); 
    pr->setEndValue(end); 
    pr->setDuration(1000); 
    pr->setEasingCurve(QEasingCurve::Linear); 
    pr->start(); 
    u-=30; 
    pr->pause(); 
} 

void MainWindow::back() 
{ 
    end.setX(b); 
    pr->setEndValue(end); 
    pr->setDuration(1000); 
    pr->setEasingCurve(QEasingCurve::Linear); 
    pr->start(); 
    b-=40; 
} 

void MainWindow::down() 
{ 
    u+=30; 
    end.setY(u); 
    pr->setEndValue(end); 
    pr->setDuration(1000); 
    pr->setEasingCurve(QEasingCurve::Linear); 
    pr->start(); 
} 
+0

代碼太低質量的。我無法猜測什麼是單字母變量。在up()之後立即調用'down()'也不會做你所需要的。動畫是異步的。如果對象需要掉下來,您需要設置一個'QTimer'並定期調用'down()'(例如每秒一次)。另外,如果用戶在動畫執行時按下某個鍵,則應該執行另一個動畫,但不會執行此操作,因爲如果動畫已經執行,則pr-> start()不執行任何操作。 –

+0

對不起我的code.you說我應該使用[QTimer]。在哪裏我使用它?調用down()函數後up.if可能把示例代碼引導me.i真的需要這個program.i非常初學者特別是在[QGraphicsView]和動畫中。 – sarina

回答

2

,因爲你在setCentralWidget使用它,它的大小將通過佈局管理,則不應使用上viewresizesetFixedSize。您應該在主窗口上使用setFixedSize

動畫是異步的。例如,當您撥打up(); down()時,這些功能將在沒有1秒暫停的情況下執行。另外,開始動畫時,它已經開始沒有效果。

通常動畫是以這種方式使用,當你確切知道你需要物體在下一秒移動的位置。當動畫已經執行時,從用戶接收指令並更改對象的軌跡很複雜。

以下是顯示此任務的動畫正確使用的示例。對象每秒可以接收一個指令(前進,後退或跳轉),並且動畫將在下一秒執行。

部首:

class MainWindow : public QMainWindow { 
    Q_OBJECT  
public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 
private: 
    QGraphicsView* view; 
    QGraphicsScene* scene; 
    void keyPressEvent(QKeyEvent* k); 
    QGraphicsObject* object; 
    QPropertyAnimation* animation; 
    QPointF pos; 
    double speed; 

    enum Command { 
    command_none, command_jump, command_forward, command_back 
    }; 
    Command next_command; 

private slots: 
    void timeout(); 
}; 

來源:

MainWindow::MainWindow(QWidget *parent) : 
     QMainWindow(parent) 
{ 
    view = new QGraphicsView; 
    scene = new QGraphicsScene; 
    object = scene->addWidget(new QPushButton("test")); 
    object->setPos(0, -object->boundingRect().height()); 
    animation = new QPropertyAnimation(object,"pos"); 
    animation->setDuration(1000); 
    view->setScene(scene); 
    setFixedSize(800,800); 
    scene->addRect(-500, -200, 1000, 200); 
    setCentralWidget(view); 
    scene->addItem(object); 
    next_command = command_none; 
    speed = 100; 

    QTimer* timer = new QTimer(this); 
    connect(timer, SIGNAL(timeout()), this, SLOT(timeout())); 
    timer->start(1000); 
} 

MainWindow::~MainWindow() {} 

void MainWindow::keyPressEvent(QKeyEvent *k) 
{ 
    switch (k->key()) { 
    case Qt::Key_J: { 
    next_command = command_forward; 
    break; 
    } 
    case Qt::Key_Z: { 
    next_command = command_jump; 
    break; 
    } 
    case Qt::Key_F: { 
    next_command = command_back; 
    break; 
    } 
    default: 
    break; 
    } 
} 

void MainWindow::timeout() { 
    //fall 
    if (pos.y() < 0) { 
    pos.setY(pos.y() + speed); 
    if (pos.y() >= 0) { 
     pos.setY(0); 
    } 
    } 
    //action 
    switch(next_command) { 
    case command_forward: 
    pos.setX(pos.x() + speed); 
    break; 
    case command_back: 
    pos.setX(pos.x() - speed); 
    break; 
    case command_jump: 
    if (pos.y() == 0) { 
     pos.setY(pos.y() - speed); 
    } 
    break; 
    default: 
    break; 
    } 
    next_command = command_none; 
    animation->stop(); 
    animation->setEndValue(pos - QPointF(0, object->boundingRect().height())); 
    animation->start(); 
} 
+0

:謝謝你的answer.i編譯你的代碼,但它有一個錯誤.'object = scene-> addwidget(new QPushButton(「test」);'我決定不使用animation.and我改變' x'和'y'我的物品直接,但現在我不知道如何停止我的物品。我在這個頁面問這個問題作爲Answer.or再次請求在這個網站。? – sarina

+0

如果可能的話,請訪問這個職位也。沒有人回答我。[http://stackoverflow.com/questions/24475305/how-to-remove-extra-margins-arounding-a-qpixmap] – sarina