做了一个雪花飘落的程序,参考了以下两篇文章。雪花是以波浪线飘落。雪花用QToolButton添加图片制成。

参考文章:Qt实现桌面动态背景雪花飘落程序 - 零落年华 - 博客园

QT QPainter绘制图形-动态正弦曲线(水波效果)_jmlinux的博客-CSDN博客

snownode.cpp //雪花类

#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 MyAnimation(this, "pos"))
{//必须设置为无边框,否则可见区域和图片绘制区域将出现不重叠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(pos());m_animation->setEndValue(QPoint(x,m_areaSize.height()));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);
}

myanimation.cpp//动画类,实现移动路线

#include "myanimation.h"
#include <QtMath>MyAnimation::MyAnimation(QObject *target, const QByteArray &propertyName, QObject *parent):QPropertyAnimation(target, propertyName, parent)
{}void MyAnimation::updateCurrentTime(int currentTime)
{if (m_path.isEmpty()){QPoint to = endValue().toPoint();QPoint from = startValue().toPoint();int height=to.y() - from.y();//正弦曲线公式 y = A * sin(ωx + φ) + kdouble w = M_PI/200;  //w为角速度 ,可以理解为波浪的密度,越大密度越大double A = 40;    //  A表示振幅,可以理解为水波的高度,越大高度越高double k = from.x();    //  k表示y轴偏移int offset = to.x() - from.x();for(int y = from.y(); y <= to.y(); y++)  //x从0~w的值而改变,从而得到正弦曲线{double waveX = (double)(A * qSin(w * y)) + k + y * offset / height;// waveY随着x的值改变而改变,从而得到正弦曲线if (y == from.y()){m_path.moveTo(waveX, y);}m_path.lineTo(waveX, y);   //从上一个绘制点画一条线到(x,waveY);}}int dura = duration();const qreal progress = ((dura == 0) ? 1 : ((((currentTime - 1) % dura) + 1) / qreal(dura)));qreal easedProgress = easingCurve().valueForProgress(progress);if (easedProgress > 1.0){easedProgress -= 1.0;}else if (easedProgress < 0){easedProgress += 1.0;}QPointF pt = m_path.pointAtPercent(easedProgress);updateCurrentValue(pt);emit valueChanged(pt);
}

mainwindow.cpp//界面类,设置雪花飘落的逻辑

#include "mainwindow.h"
#include <QKeyEvent>
#include <QPixmap>
#include <QBitmap>
#include <QTime>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent)
{//让程序无边框setWindowFlags( Qt::FramelessWindowHint );//让程序背景透明setAttribute(Qt::WA_TranslucentBackground, true);InitEnv();m_timeManager = new QTimer(this);connect( m_timeManager,SIGNAL(timeout()), SLOT(SnowFalling()));m_timeManager->start(500);m_snowPool = 100;for(int i=0; i<m_snowPool; ++i){SnowNode* node = new SnowNode(this);Q_ASSERT(node);m_snowWaitList.append(node);}
}//初始化资源
void MainWindow::InitEnv()
{//初始化随机数种子qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
}MainWindow::~MainWindow()
{}void MainWindow::keyPressEvent( QKeyEvent * event )
{//按下esc键时,关闭if(event->key() == Qt::Key_Escape){close();}
}void MainWindow::AcceptShow(QList<SnowNode*> addList)
{foreach (SnowNode* var, addList){Q_ASSERT(var);m_snowFallingList.append(var);var->FallingAnimation();}QList<SnowNode*> landerList;for(int i=0; i<m_snowFallingList.size(); ){if (!m_snowFallingList.at(i)->IsLander()){++i;continue;}landerList.append(m_snowFallingList.at(i));m_snowFallingList.removeAt(i);}if (landerList.size() > 0){emit SnowRecycle(landerList);}
}void MainWindow::SnowFalling()
{QList<SnowNode*> fallingList;int count = qrand() % 4;for (int i=0; i< count; i++){SnowNode *node = m_snowWaitList.first();node->InitSnow();node->setHidden(false);fallingList.append(node);m_snowWaitList.pop_front();}if (fallingList.size() > 0){AcceptShow(fallingList);}
}void MainWindow::SnowRecycle(QList<SnowNode*> addList)
{for (int i=0; i<addList.size(); ++i){m_snowWaitList.append(addList.at(i));}
}

最后效果如下

Qt雪花飘落程序,下雪相关推荐

  1. java之雪花飘落效果的实现(撩妹小程序)

    第一章:程序的思路分析 1.思路分析 程序采用面向对象的思想,包含主程序,面板类和雪花类. 主程序用来生成窗口,存放面板等作用. 面板类用来存放背景图片,存放生成的雪花对象,定时去刷新雪花的位置,形成 ...

  2. HTML5 canvas绘制雪花飘落动画(需求分析、知识点、程序编写分布详解)

    HTML5 canvas绘制雪花飘落动画(需求分析.知识点.程序编写分布详解) 原文:HTML5 canvas绘制雪花飘落动画(需求分析.知识点.程序编写分布详解) 看到网上很多展示html5雪花飞动 ...

  3. HTML5七夕情人节表白网页(新年倒计时+白色雪花飘落) HTML+CSS+JS 求婚 html生日快乐祝福代码网页 520情人节告白代码 程序员表白源码 抖音3D旋转相册 js烟花代码 c

    HTML5七夕情人节表白网页❤新年倒计时+白色雪花飘落❤ HTML+CSS+JS 求婚 html生日快乐祝福代码网页 520情人节告白代码 程序员表白源码 抖音3D旋转相册 js烟花代码 css爱心表 ...

  4. HTML5七夕情人节表白网页(圣诞雪花飘落) HTML+CSS+JS 求婚 html生日快乐祝福代码网页 520情人节告白代码 程序员表白源码 抖音3D旋转相册 js烟花代码 css爱心表白

    HTML5七夕情人节表白网页❤圣诞雪花飘落❤ HTML+CSS+JS 求婚 html生日快乐祝福代码网页 520情人节告白代码 程序员表白源码 抖音3D旋转相册 js烟花代码 css爱心表白 这是程序 ...

  5. java实现下雪雪花飘落并堆积效果

    在一个800*600的画布上实现雪花飘落并在下方堆积的一个效果.实现方案是画两层雪花,一层是飘落的,一层是在下方不动并堆积的. 演示效果(黄色的是月亮): 代码: import java.awt.Co ...

  6. 雪花飞舞的java程序_jqmcsnow jquery圣诞节雪花飘落网页特效,配上了 树和雪景,在加上本效果实现的 飞 JavaScript 238万源代码下载- www.pudn.com...

    文件名称: jqmcsnow下载 收藏√  [ 5  4  3  2  1 ] 开发工具: Java 文件大小: 146 KB 上传时间: 2014-09-28 下载次数: 0 详细说明:jquery ...

  7. 用 Python 实现带音乐的雪花飘落雪景图

    这几天很多地方陆续出现了降雪的天气,对于年内的第一场雪,大家的热情显然是比较高涨的,比如很多人顶着雪花到各种景点打卡,再比如一位东北大哥要直播卖雪送辣白菜给南方人. 此事还上了微博热搜,博主唐僧评论: ...

  8. OpenCV-Python 雪花飘落特效

    来源:https://blog.csdn.net/LaoYuanPython/article/details/115298737 首先看一下目标效果: 素材准备 & 思路分析 本次雪花来源于如 ...

  9. php实现页面雪花效果,JavaScript_使用javascript实现雪花飘落的效果,看了javascript网页特效实例大全 - phpStudy...

    使用javascript实现雪花飘落的效果 看了javascript网页特效实例大全中的图片飘下的效果实例,觉得值得动手学习下. 就把图片改成雪花图,完成一个雪花飘下的效果. 并且,其中有些内容比较陈 ...

  10. 手机html5雪花飘落,如何使用HTML5canvas实现雪花飘落

    这篇文章主要为大家详细介绍了HTML5 canvas实现雪花飘落特效,效果实现引人入胜,很逼真的动画效果,感兴趣的小伙伴们可以参考一下 看到网上很多展示html5雪花飞动的效果,确实非常引人入胜,我相 ...

最新文章

  1. “智源-MagicSpeechNet 家庭场景中文语音数据集挑战赛”上线
  2. 《C和C++程序员面试秘笈》——1.9 如何理解C++是面向对象化的,而C是面向过程化的...
  3. 【Linux 内核】编译 Linux 内核 ④ ( 打开 Linux 内核编译 菜单配置 |菜单配置中的光标移动与选中状态 | 保存配置 | 配置项帮助文档 )
  4. linux的bh文件停止运行,linux 系统 rcu_bh self-detected stall 问题处理
  5. Linux学习之系统编程篇:循环创建多个子进程练习
  6. RabbitMq--4--集群(转载)
  7. 一对多关系(one-to-many)
  8. STM32----重温ADC测量电压值
  9. Exp3 免杀原理与实践 20164314
  10. 读完 Effective Java,我整理这 59 条技巧!
  11. Java性能调优的11个实用技巧
  12. 艾滋病多学科协作诊治模式的实施与成效
  13. 基于Ant在NetBeans 11.0中创建并使用第三方库(jar包)
  14. 世界强大的移动便携图形工作站介绍(轻便型便携工作站(PL系列)介绍)
  15. VOT数据集下载——(vot2013到vot2019)
  16. C++读入用逗号隔开的数据
  17. 使用虚拟机备份软件备份OpenStack虚拟机
  18. 禁用微信浏览器字体调整的方法
  19. PP.io的三个阶段,“强中心”——“弱中心”——“去中心”
  20. 京东数据中心主要基础设施系统(一)

热门文章

  1. shap 解释理赔时效模型特征
  2. widows 句柄HINSTANCE
  3. php精华之独孤九剑
  4. python中如何画出决策树_python画决策树
  5. linux下的键盘检测
  6. 数据分析——员工离职预测
  7. Rime添加Emoji输入方案
  8. 软件测试实验学习笔记系列2 -- lint,splint的使用
  9. 献给广大的程序猿——颈椎保养
  10. 《关键对话——如何高效能沟通》读书笔记