效果图:
源码地址:https://gitee.com/lingluonianhua/snow.git
本项目为个人学习项目,仅供个人学习参考。
主要包括以下功能:
1、修改电脑背景
2、实现雪花飘落效果
3、添加部分饰品
实现方案:
1、SnowNode雪花节点类,定义雪花的形状、初始化状态、行为
2、WaitFallen待飘落的雪花类,用于定时向屏幕投入雪花
3、Snowfalling 正在飘落的雪花,定时扫描雪花是否到达地上,雪花到达地上时,发送信号
4、Snowpack 地上的积雪,定时将积雪回收
5、GroundLife 地面物体
Vegetable 植物
6、SnowFrame雪花画面,对雪花进行统一管理
功能插件:
PngButton 图片按钮
WidgetMove 普通的按钮移动
Virtual3DMove 将按钮虚拟成三维效果,按钮移动时进行放大和缩小
变量:
雪花池数量: 200
向屏幕投送雪花间隔: 1000
每次投送雪花数量:0-5
雪花飘落全程时间:10秒
核心代码
#include "pubbase.h"
#include "snownode.h"
#include <QSize>
#include <QPoint>
#include <QBitmap>
#include <QPixmap>
#include <QToolButton>
#include <QApplication>
#include <QDesktopWidget>
#include <QGraphicsScene>
#include <QGraphicsView>
const int SnowNode::MAXSWOW = 19;
SnowNode::SnowNode(QWidget *parent):
QToolButton(parent),m_animation(new QPropertyAnimation(this, "geometry"))
{
//必须设置为无边框,否则可见区域和图片绘制区域将出现不重叠
setWindowFlags( Qt::FramelessWindowHint );
resize(GetSnowSize());
//对图片进行缩放
m_pixmap.load(GetImgFileName());
m_pixmap = m_pixmap.scaled(this->size(),Qt::IgnoreAspectRatio);
setHidden(true);
m_areaSize.setWidth(QApplication::desktop()->width());
m_areaSize.setHeight(QApplication::desktop()->height());
}
//初始化雪花
void SnowNode::InitSnow()
{
this->move(qrand() % m_areaSize.width(), -32);
}
//设置雪花动画
void SnowNode::FallingAnimation()
{
int x = qrand()% m_areaSize.width();
//雪花飘落全程时间
m_animation->setDuration(8000);
m_animation->setStartValue(QRect( pos(), size()));
m_animation->setEndValue(QRect( QPoint(x,m_areaSize.height()), size()));
m_animation->start();
}
//返回雪花是否已着陆
bool SnowNode::IsLander()
{
if(this->pos().y() >= m_areaSize.height()
&& m_animation->state() == QAbstractAnimation::Stopped
)
{
return true;
}
return false;
}
void SnowNode::paintEvent(QPaintEvent *event)
{
//绘制背景图片
this->setIcon(QIcon(m_pixmap));
this->setIconSize(size());
//将png图片透明部分设置为穿透
this->setMask(m_pixmap.mask());
//绘制
QToolButton::paintEvent(event);
}
//每一朵雪花的大小,采用随机生成
QSize SnowNode::GetSnowSize()
{
int x = qrand() % 10;
return x >= 6 ? QSize(32,32) : x >= 3 ? QSize(24,24) : QSize(16,16);
}
//获取雪花文件名
QString SnowNode::GetImgFileName()
{
return QString().sprintf(":/image/_%d.png", qrand()% MAXSWOW);
}