Qt實現雪花飄落屏保

效果圖:

輸入圖片說明

源碼地址: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);
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章