Qt QPainter画个球啊

Qt QPainter画个球啊

看效果

方法

  1. 使用绘图事件,绘制一个图形
  2. 使用定时事件,不停更新图形位置

代码

.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();
}