Qt 实现桌面雪花飘落代码

代码很简单, 贴个主要的实现过程吧. 理应支持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 creator 工程:
工程压缩包下载: http://xiazai.jb51.net/201312/yuanma/DesktopSnow(jb51.net).zip

(0)

相关推荐

  • Qt定时器和随机数详解

    环境是:Windows 7 + Qt 4.8.1 +Qt Creator 2.4.1 一.定时器 Qt中有两种方法来使用定时器,一种是定时器事件,另一种是使用信号和槽.一般使用了多个定时器时最好使用定时器事件来处理. 1.新建Qt Gui应用,项目名称为myTimer,基类选择QWidget,类名为Widget. 2.到widget.h文件中添加函数声明: protected:     void timerEvent(QTimerEvent *); 然后添加私有变量定义: int id1, id

  • Qt for Android开发实例教程

    本文讲述了使用Qt5.3.0开发Android应用的方法,由于官方资料较少,此处记录开发过程遇到的问题及解决方法.具体步骤如下: 1.Android平台的视频播放,只能使用qml的MediaPlayer 2.qml中控件的路径必须加file://  例如: Image{ source: "file:///mnt/usbhost1/Config/logo.png" } 3.C++与qml中js的方法互调 QQuickView view; view.setSource(QUrl(QStri

  • Qt实现图片移动实例(图文教程)

    这学期实训的时候用MFC做过一个飞机大战,很无聊的东西,一直想用Qt做一个,但是在学校的时候比较颓,回来看了一下. 首先需要解决的问题是图片的移动,怎么说飞机啊子弹啊都是动着的,图片当然要跑起来. 闲话休絮,首先用QtCreator新建一个QtGui程序,命名为PaintWidget,随便起的名字,实验么这不是. 会生成这三个文件,其中呢ui不用管,实验的图片移动需要用的是Event,不是信号槽,所以ui就不管了,放了那就是. 第一步要把图片画出来,参照<Qt学习之路的这段代码>,不难把图画出

  • Qt之ui在程序中的使用-多继承法介绍

    thirdDialog.h 复制代码 代码如下: #ifndef THIRDDIALOG_H #define THIRDDIALOG_H #include <QtGui> #include "ui_third.h" class thirdDialog:public QDialog,private Ui::Third { Q_OBJECT public: thirdDialog(QWidget *parent=0); ~thirdDialog(); }; #endif thi

  • qt实现倒计时示例

    用Qt写的倒计时程序,可根据指定时间作不同用途.创建Qt的简单GUI工程,修改main.cpp即可. 复制代码 代码如下: #include <QApplication>#include <QLabel>#include <QDate>#include <QLayout>int main(int argc, char *argv[]){    QApplication a(argc, argv);    QLabel *label = new QLabel;

  • QTabWidget标签实现双击关闭的方法(推荐)

    用Qt做ARM,发现Qt4中QTabWidget原生的关闭按键(X)太小,用触摸板很难按到.于是乎想到类似于浏览器的双击关闭功能,因为之前做过C#的资源管理器,以为可以直接绑定DoubleClick,可后来翻遍了也没找到相应的SLOT,结果在QWidget中捕捉信号,就是没有QTabWidget标签的鼠标事件,坑爹那!随后,又在网上各种搜索,结果找到的是各种问题,每一个准确回答出来的.....最后思来想去,实在不行,就用最笨的方法,仿Hock实现! 于是乎,我重载了QTabWidget(由于ta

  • Qt qml中listview 列表视图控件(下拉刷新、上拉分页、滚动轴)

    Qt qml listview下拉刷新和上拉分页主要根据contentY来判断.但要加上顶部下拉指示器.滚动条,并封装成可简单调用的组件,着实花了我不少精力:) 先给大家展示下效果图: [功能] 下拉刷新和上拉分页逻辑 /下拉刷新 /上拉更多 /滚动栏 /工具栏半拉显隐 Author: surfsky.cnblogs.com Lisence: MIT 请保留此文档声明 History: init. surfsky.cnblogs.com, 2015-01 add initPosition pro

  • Windows下Eclipse+PyDev配置Python+PyQt4开发环境

    本文为大家分享了Windows下配置Python PyQt4开发环境的详细步骤,供大家参考,具体内容如下 1. 下载相关软件 Eclipse下载地址:http://www.eclipse.org/downloads/ JRE下载地址:http://www.java.com/zh_CN/download/manual.jsp PyDev下载地址: http://sourceforge.net/projects/pydev/ Python下载地址:http://www.python.org/geti

  • C++ Qt属性系统详细介绍

    C++ Qt属性系统详细介绍 Qt提供了一个绝妙的属性系统.跟那些由编译器提供的属性差不多.然而,作为一个独立于编译器和平台的库,Qt不依赖于非标准的编译特性,比如__property 或[property].Qt可以在任何平台上的标准编译器下编译.Qt属性系统基于元数据对象系统--就是那个提供了对象内置信号和槽通讯机制的家伙. 声明属性需要什么 要声明一个属性,需在继承自QObject的类中使用Q_PROPERTY()宏. Q_PROPERTY(type name READ getFuncti

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

    代码很简单, 贴个主要的实现过程吧. 理应支持windows和linux桌面版的, 但是linux下就暂时不测试了. 懒得重启. 有空测试一下. 系统资源消耗: 我在1.65GHz 双核CPU, 4G RAM, 32bit Win7 下, 19M左右的内存消耗, 6%-7%左右的CPU消耗.全部源码在后面的链接. 复制代码 代码如下: #include "widget.h"#include "ui_widget.h"#include <QDesktopWidg

  • 用js代码和插件实现wordpress雪花飘落效果的四种方法

    冬天到了,很多的博客空间都加了雪花的效果,于是去看了看他们的效果实现.有好几个效果代码,就拿过来了,有需要的朋友可以拿过去试试看. 雪花大图片: 效果代码一 <script type="text/javascript" language="javascript"> (function() { function k(a, b, c) { if (a.addEventListener) a.addEventListener(b, c, false); els

  • JS和JQuery实现雪花飘落效果

    很多朋友在做特效网页的时候需要用到雪花飘落的效果,我们这里给大家整理了分别用JS还有JQuery两种代码实现这个效果的方式. 我们先来看一下需要实现的雪花效果: 这次实现的雪花飘落的效果很简单,主要是为了练习练习JavaScript中的定时器,setTimeout 和 setInterval. 解释 setTimeout() setTimeout函数用来指定某个函数或某段代码,在多少毫秒之后执行.它返回一个整数,表示定时器的编号,以后可以用来取消这个定时器. var timerId = setT

  • OpenGL Shader实例分析(7)雪花飘落效果

    研究了一个雪花飘落效果,感觉挺不错的,分享给大家,效果如下: 代码如下: Shader "shadertoy/Flakes" { // https://www.shadertoy.com/view/4d2Xzc Properties{ iMouse ("Mouse Pos", Vector) = (100,100,0,0) iChannel0("iChannel0", 2D) = "white" {} iChannelReso

  • python实现雪花飘落效果实例讲解

    在学习pygame模块过程中,我们可以通过使用 pygame模块实现很多功能性的东西,但是很多人应该没有利用pygame实现过雪花飘落的效果吧,有时候可能是不知道从何入手或者是没有时间写,接下来我就教大家如何利用pygame模块实现雪花飘落的效果吧,总共都用不到40行代码就可以实现哦,希望对你们有所帮助 第一步:我们先打开我们的pycharm软件,然后新建一个Python文件 第二步:建立好文件之后,我们在编辑页面输入以下代码: import pygame import sys #导入模块 im

  • IOSdrawRect实现雪花飘落效果

    本文实例为大家分享了IOSdrawRect实现雪花飘落效果的具体代码,供大家参考,具体内容如下 绘制原理: 雪花效果最主要的思路就是在于循环产生带雪花图片的imageView, 产生的雪花的imageview的 x.y.宽.下落的速度都是随机的,这个可以用随机数来产生数据. 实现代码: #import <UIKit/UIKit.h> @interface HHFSnowflakeFallingView : UIView /** * 快速创建一个雪花飘落效果的view * * @param bg

  • 手写简单的jQuery雪花飘落效果实例

    前言 最近闲来无事,准备写个雪花飘落的效果,没有写太牛逼的特效,极大的简化了代码量,这样容易读取代码,用起来也很简单,对于那些小白简直是福利啊,简单易读易学.先直接上代码吧,然后再一一讲解,直接复制粘贴就可以拿来用了,改起来更是容易. <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>雪花飘落</title> </head> <

  • JS实现的雪花飘落特效示例

    本文实例讲述了JS实现的雪花飘落特效.分享给大家供大家参考,具体如下: 首先我们要创建一个HTML文件,将其命名为index.html <!DOCTYPE html> <html> <head> <title> Canvas - 雪花特效 </title> <meta charset="utf-8"> <style> *{ margin:0px; padding:0px; } .myCanvas{ fl

  • jQuery实现雪花飘落效果

    本文实例为大家分享了jQuery实现雪花飘落效果的具体代码,供大家参考,具体内容如下 效果展示: 源码展示: <!doctype html> <html> <head> <meta charset="utf-8"> <title>jquery实现雪花飘落</title> <script src="http://libs.baidu.com/jquery/1.11.3/jquery.min.js&qu

  • 基于Matlab实现有雪花飘落的圣诞树的绘制

    目录 圣诞树及礼物绘制 基础修饰 绘制星星和光晕 绘制彩灯 绘制雪花 动态变化实现 完整代码 圣诞节快到了(虽然还有十天),一起来用MATLAB画个简单圣诞树叭~树的整体构造参考大佬Anselm,同时一部分装饰代码参考了大佬Hanchu Wang. 代码几乎取消了全部的循环,因此至少需要17b之后的版本,仅存的循环用来让树旋转起来,让雪花飘落起来,让树顶上的星光摇曳起来~ 圣诞树及礼物绘制 % 生成树本体曲面 treeFunc=@(h)[h(1),h(h>0&h<=3).*0+1.5,

随机推荐