zoukankan      html  css  js  c++  java
  • 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();
    }
    

  • 相关阅读:
    被标记为事务的方法互相调用的坑(上)
    几种实现延时任务的方式(三)
    几种实现延时任务的方式(二)
    几种实现延时任务的方式(一)
    Windows AD日志分析平台WatchAD安装教程
    Django单元测试中Fixtures用法
    威联通(NAS)搭建个人图床
    centOS极简安装并启动ngnix
    【JS档案揭秘】第一集 内存泄漏与垃圾回收
    【JS简洁之道小技巧】第一期 扁平化数组
  • 原文地址:https://www.cnblogs.com/Doyoung/p/14008695.html
Copyright © 2011-2022 走看看