手机
当前位置:查字典教程网 >编程开发 >C语言 >Qt 实现桌面雪花飘落代码
Qt 实现桌面雪花飘落代码
摘要:代码很简单,贴个主要的实现过程吧.理应支持windows和linux桌面版的,但是linux下就暂时不测试了.懒得重启.有空测试一下.系统资...

代码很简单, 贴个主要的实现过程吧. 理应支持windows和linux桌面版的, 但是linux下就暂时不测试了. 懒得重启. 有空测试一下.

系统资源消耗: 我在1.65GHz 双核CPU, 4G RAM, 32bit Win7 下, 19M左右的内存消耗, 6%-7%左右的CPU消耗.

全部源码在后面的链接.

复制代码 代码如下:

#include "widget.h"

#include "ui_widget.h"

#include <QDesktopWidget>

#include <QPalette>

#include <QBrush>

#include <time.h>

#ifdef Q_OS_LINUX

#include <X11/extensions/shape.h>

#endif

#ifdef Q_OS_WIN

#include <windows.h>

#endif

Widget::Widget(QWidget *parent) :

QWidget(parent),

ui(new Ui::Widget)

{

ui->setupUi(this);

setGeometry(0, 0, qApp->desktop()->width(), qApp->desktop()->height());

setWindowFlags(windowFlags()

|Qt::FramelessWindowHint //去边框

|Qt::X11BypassWindowManagerHint //linux下脱离任务管理器

|Qt::WindowStaysOnBottomHint //最低层显示

|Qt::Tool //不在任务栏显示

);

setAttribute(Qt::WA_TranslucentBackground);

setWindowState(Qt::WindowNoState //不激活

|Qt::WindowFullScreen //全屏

);

setFocusPolicy(Qt::NoFocus);

setWindowOpacity(WINDOW_OPACITY);

#ifdef Q_OS_LINUX

XShapeCombineRectangles(QX11Info::display(), winId(), ShapeInput, 0,

0, NULL, 0, ShapeSet, YXBanded);

#endif

#ifdef Q_OS_WIN

SetWindowLong(winId(), GWL_EXSTYLE, GetWindowLong(winId(), GWL_EXSTYLE) |

WS_EX_TRANSPARENT | WS_EX_LAYERED);

#endif

int i=0;

pixmapList[i++].load(":/snowIcons/11.png");

pixmapList[i++].load(":/snowIcons/03.png");

pixmapList[i++].load(":/snowIcons/06.png");

pixmapList[i++].load(":/snowIcons/08.png");

pixmapList[i++].load(":/snowIcons/10.png");

pixmapList[i++].load(":/snowIcons/12.png");

pixmapList[i++].load(":/snowIcons/13.png");

pixmapList[i++].load(":/snowIcons/16.png");

pixmapList[i++].load(":/snowIcons/17.png");

pixmapList[i++].load(":/snowIcons/18.png");

pixmapList[i++].load(":/snowIcons/19.png");

for(i = 0; i < MAX_PICS; i++)

{

picLabel[i] = new QLabel(this);

picLabel[i]->setGeometry(-128, -128, 64, 64);

}

startTimer(150);

}

Widget::~Widget()

{

delete ui;

}

void Widget::timerEvent(QTimerEvent *e)

{

const int timeinit = 10;

static int timeCount = timeinit;

static int initLabel = MAX_PICS;

if(--timeCount <= 0)

{

qsrand(::time(NULL));

timeCount = timeinit;

if(initLabel > 0)

{

--initLabel;

picLabel[initLabel]->move(0, -picLabel[initLabel]->height());

}

}

FlashSnow();

}

void Widget::SetLabelBG(const QPixmap &pixmap, QLabel *label)

{

if(!label || pixmap.isNull()) return;

QPixmap map = pixmap.scaled(label->size());

if(map.isNull()) return;

label->setPixmap(map);

}

void Widget::FlashSnow()

{

int i;

for(i = 0; i < MAX_PICS; i++)

{

if(picLabel[i] == NULL) continue;

if(picLabel[i]->y() == -picLabel[i]->height())

{

//resize label

int size = (qrand()%64)+16;

picLabel[i]->resize(size, size);

//init place

int x = (qrand()%this->width());

picLabel[i]->move(x, 10-picLabel[i]->height());

//repaint label's backgroud

int imgId = (qrand()%MAX_PIXMAP);

SetLabelBG(pixmapList[imgId], picLabel[i]);

}

else

{

//snow flow down

WidgetFlowDown(picLabel[i]);

}

}

}

void Widget::WidgetFlowDown(QWidget *widget, bool bRandom)

{

if(!widget) return;

int downY = widget->y()+5;

if(bRandom)

{

downY = widget->y()+qrand()%(this->height() - widget->y());

}

if(downY > (this->height())) downY = -widget->height();

widget->move(widget->x(), downY);

}

接下来上个截屏吧:

Qt 实现桌面雪花飘落代码1

最后是全部源码了, 是个Qt creator 工程:

工程压缩包下载: http://xiazai.jb51.net/201312/yuanma/DesktopSnow(jb51.net).zip

【Qt 实现桌面雪花飘落代码】相关文章:

函数指针的强制类型转换实现代码

用C# 实现鼠标框选效果的实现代码

C/C++实现矩阵的转置(示例代码)

C 二分查找 递归与非递归的实现代码

k均值算法c++语言实现代码

方阵顺时针旋转的实现代码

简单的汉诺塔问题解法代码

C++产生随机数的实现代码

Linux C 获取进程退出值的实现代码

解析shell排序的实现代码

精品推荐
分类导航