我正在尝试创建一个简单的球动画,该球在屏幕上徘徊并在墙壁上反弹。由于我刚接触C++,因此在执行此任务时遇到了一些问题。我也在使用Qt库。
球只是停留在同一位置,并来回移动一点,这很奇怪,因为我创建了一个与我的graphicsView大小相同的SceneRect。

mainwindow.cpp:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QGraphicsScene>
#include <QtWidgets>


float movement_x = 2.5;
float movement_y = 2.0;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

void MainWindow::showEvent(QShowEvent *event){


    scene = new QGraphicsScene(this);

    scene -> setSceneRect(ui->graphicsView->geometry().x(),          ui->graphicsView->geometry().y(),
                      ui->graphicsView->geometry().width(), ui->graphicsView->geometry().height());
    ui->graphicsView->setScene(scene);
    QPen redpen(Qt::red);


    QBrush brush(Qt::green);
    //QBrush brush2(Qt::black);
    QPen mypen(Qt::blue);
    mypen.setWidth(7);


     ellipse = scene->addEllipse(100.0,100.0,20.0,20.0,mypen,brush);
     timer1 = startTimer(50);
     timer2 = startTimer(600);

}

void MainWindow::timerEvent(QTimerEvent *event){
    // check for radius
    if(ellipse->pos().x() >= scene->sceneRect().right() ||       ellipse->pos().x() <= scene->sceneRect().left()){
        movement_x = -movement_x;
     }
    if(ellipse->pos().y() >= scene->sceneRect().bottom() ||     ellipse->pos().y() <= scene->sceneRect().top()){
        movement_y = -movement_y;
     }
    ellipse->moveBy(movement_x, movement_y);

}

MainWindow::~MainWindow()
{
    delete ui;
}

mainwindow.h:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QGraphicsScene>

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();


protected:
    void showEvent(QShowEvent* event);
    void timerEvent(QTimerEvent* event);
private:
    Ui::MainWindow *ui;
    QGraphicsScene *scene;
    QGraphicsEllipseItem *ellipse;
 };

#endif // MAINWINDOW_H

main.cpp:
#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.resize(800,600);
    w.show();

    return a.exec();
}

最佳答案

pos的初始值为(0,0)。因此,您的更新在两个值之间振荡。在addEllipse之后,您必须设置场景rect中的初始位置。例如

ellipse->setPos(100,100);

10-04 15:02