1. 程式人生 > 實用技巧 >Qt QPainter畫個球啊

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