Qt QPainter畫個球啊
Qt QPainter畫個球啊
目錄
看效果
方法
- 使用繪圖事件,繪製一個圖形
- 使用定時事件,不停更新圖形位置
程式碼
.h
#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軸移動狀態
};
.cpp
#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();
}
完