.happ
#pragma once #include <QWidget> #include <QPaintEvent> #include <QTimerEvent> #define STEP 3 // 球移動的步長 #define WIDTH 50 // 球的寬度 #define HEIGHT 50 // 球的高度 class painterTest : public QWidget { Q_OBJECT public: painterTest(QWidget *parent = nullptr); ~painterTest(); protected: virtual void paintEvent(QPaintEvent *event); virtual void timerEvent(QTimerEvent *event); private: int px = 0; // x軸位置 int py = 0; // y軸位置 bool xState = true; // x軸移動狀態 bool yState = true; // y軸移動狀態 };
.cppthis
#include "painterTest.h" #include <QPainter> #include <QBrush> #include <QPixmap> #include <QDir> #include <QCoreApplication> painterTest::painterTest(QWidget *parent) : QWidget(parent) { this->startTimer(10); } painterTest::~painterTest() { } void painterTest::paintEvent(QPaintEvent *event) { QPainter * pt = new QPainter(this); pt->setPen(Qt::blue); pt->setBrush(Qt::lightGray); // 繪製一個背景 pt->drawRect(this->rect()); // 繪製一個圖片 pt->drawPixmap(px, py, WIDTH, HEIGHT, QPixmap(QDir(qApp->applicationDirPath()).absoluteFilePath("./football.png"))); } void painterTest::timerEvent(QTimerEvent *event) { /** * 判斷 * 若是小球x軸位置到達 窗口左邊界減去小球自己的寬度 的位置 * 將小球的移動狀態設置爲向右移動 * 不然將小球的移動狀態設置爲向左移動 */ if (this->width() - WIDTH < px) { xState = false; } else if (!(0 < px)) { xState = true; } /** * 判斷 * 若是小球y軸位置到達 窗口底邊界減去小球自己的高度 的位置 * 將小球的移動狀態設置爲向上移動 * 不然將小球的移動狀態設置爲向下移動 */ if (this->height() - HEIGHT < py) { yState = false; } else if (!(0 < py)) { yState = true; } /** * 判斷小球的移動狀態 * 選擇將小球的位置加步長或減步長 */ if (xState) { px += STEP; } else { px -= STEP; } if (yState) { py += STEP; } else { py -= STEP; } // 更新繪圖 this->update(); }
完code