圣诞节到了,写个桌面下雪的程序庆祝一下。过节也是要有仪式感的!!
显示效果如下:

具有如下功能:

  1. 托盘菜单,可以配置、关于作者、退出。
  2. 可以配置是否下雪、烟花效果,配置雪的浓度和下降的速度。

完整代码和可执行程序下载:

可执行程序:
链接:https://pan.baidu.com/s/1zzL_grZa9fABeKXPOFKM0Q
提取码:567n

源码下载:
链接:https://pan.baidu.com/s/1CdvrCaeHa6YWeKkt8fszpw
提取码:df8t


1. 下雪的实现

这里下雪和烟花的效果都是用的QML实现的,其中烟花的效果可以参考这篇文章:
https://blog.csdn.net/yafeilinux/article/details/86530616

下雪的效果,使用的QML的粒子

下面贴出部分关键代码:

import QtQuick 2.12
import QtQuick.Controls 2.12
import QtQuick.Particles 2.12Rectangle {id: rootRectobjectName: "rootRect"color: Qt.rgba(0, 0, 0, 0.01);ParticleSystem{id: particleSystemobjectName: "particleSystem"}Emitter {id: particleEmitterobjectName: "particleEmitter"system: particleSystemanchors.top: parent.topanchors.horizontalCenter: parent.horizontalCenterwidth: parent.widthheight: 1emitRate: 10lifeSpan: 10000lifeSpanVariation: 100size: 25sizeVariation: 5endSize: 20velocity: CumulativeDirection {AngleDirection {objectName: "sonwVelocity"angle: 90angleVariation: 10magnitude: 200magnitudeVariation: 20}}acceleration: AngleDirection{angle: 90magnitude: 25}}ImageParticle {system: particleSystemsource: "file:///D:/Image/star.png"
//        alpha: 0
//        colorVariation: 0.2rotation: 0rotationVariation: 10rotationVelocity: 90rotationVelocityVariation: 10entryEffect: ImageParticle.Scale}Turbulence {system: particleSystemanchors.left: parent.leftanchors.verticalCenter: parent.verticalCenterwidth: parent.widthheight: parent.height / 2strength: 100}
}

代码比较简单,就是一个创建了一个粒子发射器,发射粒子就可以了。
其中控制是否下雪、速度等是通过C++的代码控制的,这里以控制下雪的速度为例,简要进行说明:

// 下雪的速度
int ParticleWidget::getSnowSpeed(void)
{QQuickItem* pRootItem = m_pQuickWidget->rootObject();QObject* object = pRootItem->findChild<QObject*>("sonwVelocity");
//    object->dumpObjectTree();if (object == nullptr)return false;int value = (int)object->property("magnitude").toDouble();return value;
}void ParticleWidget::setSnowSpeed(int speed)
{QQuickItem* pRootItem = m_pQuickWidget->rootObject();QObject* object = pRootItem->findChild<QObject*>("sonwVelocity");
//    object->dumpObjectTree();if (object == nullptr)return;object->setProperty("magnitude", speed);
}

在粒子发射器( Emitter )中的属性 velocity ,我们创建了一个objectName 为 sonwVelocity ,该对象的属性 magnitude 就是控制速度的属性。C++代码通过设置和获取该属性的值,从而获取和控制速度。这里使用 findChild 函数,查找子元素。


2. 托盘

Qt中的托盘也比较简单,使用类 QSystemTrayIcon 即可实现。

void ParticleConfig::initSystemTrayIcon(void)
{m_pSystemTrayIcon = new QSystemTrayIcon(this);m_pSystemTrayIcon->setIcon(QIcon("./images/icon.png"));// 初始化菜单QMenu* pMenu = new QMenu;// 设置QAction* pConfigAction = new QAction(tr("Setting"));QObject::connect(pConfigAction, &QAction::triggered, this, &ParticleConfig::onClickedConfigAction);pMenu->addAction(pConfigAction);// 关于我QAction* pAboutMeAction = new QAction(tr("About Me"));QObject::connect(pAboutMeAction, &QAction::triggered, this, &ParticleConfig::onClickedAboutMe);pMenu->addAction(pAboutMeAction);pMenu->addSeparator();// 退出QAction* pExitAction = new QAction(tr("Exit"));QObject::connect(pExitAction, &QAction::triggered, this, &ParticleConfig::onClickedExit);pMenu->addAction(pExitAction);m_pSystemTrayIcon->setContextMenu(pMenu);QObject::connect(m_pSystemTrayIcon, &QSystemTrayIcon::activated, \this, &ParticleConfig::onActivated);m_pSystemTrayIcon->show();
}

函数 setContextMenu() 可以为托盘设置菜单。信号 activated 则可以响应双击等事件。

void ParticleConfig::onActivated(QSystemTrayIcon::ActivationReason reason)
{if (reason == QSystemTrayIcon::DoubleClick)onClickedConfigAction();
}

3. 窗口透明

实现代码如下:

m_pQuickWidget = new QQuickWidget;
mainLayout->addWidget(m_pQuickWidget);
m_pQuickWidget->setSource(QUrl("qrc:/main.qml"));
m_pQuickWidget->setResizeMode(QQuickWidget::SizeRootObjectToView);
m_pQuickWidget->setClearColor(Qt::transparent);this->setWindowFlags(this->windowFlags() | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint | Qt::Dialog);
this->setAttribute(Qt::WA_TranslucentBackground);QTimer::singleShot(100, [&]()->void{SetWindowLong((HWND)winId(), GWL_EXSTYLE, GetWindowLong((HWND)winId(), GWL_EXSTYLE) |WS_EX_TRANSPARENT//忽略一切消息(WM_PAINT除外)| WS_EX_LAYERED);});

微信公众号:不会飞的纸飞机
不定时更新技术文章

圣诞节到了!!你的桌面下雪了吗?? - Qt趣味开发之让你的桌面下雪相关推荐

  1. 认识Web前端、Web后端、桌面app和移动app新开发模式 - 基于Node.js环境和VS Code工具...

    认识Web.桌面和移动app新开发模式 - 基于Node.js环境和VS Code工具 一.开发环境的搭建(基于win10) 1.安装node.js和npm 到node.js官网下载安装包(包含npm ...

  2. 《ArcGIS Engine+C#实例开发教程》第一讲桌面GIS应用程序框架的建立

    原文:<ArcGIS Engine+C#实例开发教程>第一讲桌面GIS应用程序框架的建立 摘要:本讲主要是使用MapControl.PageLayoutControl.ToolbarCon ...

  3. win7系统怎么样在计算机里找桌面,如何在64位win7电脑中创建一个“显示桌面”的快捷方式...

    在之前的XP系统中,咱们桌面下方的任务栏窗口中是有一个"显示桌面"的图标的,不管咱们在电脑中开启多少网页,开启多少程序,只需要点击一下这个"显示桌面"的图标,咱 ...

  4. linux ubuntu 桌面,Ubuntu Linux 入门(三):熟悉 Ubuntu Linux 桌面环境

    Posted on 2011/08/16, 13:53, by Terry Chen, under Linux. 在Ubuntu Linux 入门(二):安装 Ubuntu Linux一文中,我们已经 ...

  5. win8.1 计算机放在桌面,Win8.1怎么把开始屏幕中的程序放到桌面?

    Win8.1怎么把开始屏幕中的程序放到桌面?在Win8.1系统中,我们都要在"Metro"界面来启动程序,很多伙伴觉得很麻烦,于是询问小编能不能将Win8.1开始屏幕中的程序放到桌 ...

  6. 建立远程桌面连接计算机无密码,win7远程桌面空密码的步骤_win7系统如何设置让远程桌面登录无需密码-win7之家...

    在日常工作中,可能经常会使用到远程连接桌面功能,我们要远程桌面的话,通常是要输入密码才可以的,但是有些用户觉得麻烦,那么win7系统如何设置让远程桌面登录无需密码呢?带着大家的这个问题,本文给大家讲述 ...

  7. linux桌面环境是什么意思,Linux 黑话解释:什么是桌面环境?

    在桌面 Linux 世界中,最常用的术语之一就是 桌面环境(Desktop Environment)(DE).如果你是 Linux 的新手,你应该了解一下这个经常使用的术语. 什么是 Linux 中的 ...

  8. php 开发桌面应用,使用NW将开发的网站打包成桌面应用

    # 使用NW将我们开发的网站打包成桌面应用 >[info] NW.js 是Node.js 开发的桌面应用打包工具 > 你可以使用node语言开发桌面应用 我这里只是介绍如何将网站包一个本地 ...

  9. win7桌面取消显示计算机,教您win7系统关闭右下角显示桌面功能的解决办法

    随着电脑的使用率越来越高,我们有时候可能会遇到win7系统关闭右下角显示桌面功能问题,如果我们遇到了win7系统关闭右下角显示桌面功能的问题,要怎么处理win7系统关闭右下角显示桌面功能呢?我们只用1 ...

  10. Java客户端开发是什么_客户端桌面应用一般是用什么技术开发的?

    JAVA GUI 觉得java是最好学的语言.也是像我这种非科班出生的,踏入码农行业的敲门砖(看C c++ 学了一年,也就hello word,会写几个demo界面). Windows桌面应用程序开发 ...

最新文章

  1. hdu3182 状态压缩dp
  2. Ubuntu14.04安装wine QQ
  3. Windows系统下nodejs安装及配置
  4. Little Sub and Sequence
  5. 1011 World Cup Betting (20 分)_14行代码AC
  6. mongose + express 写REST API
  7. python怎样导入scrapy_(Python)在导入的模块scrapy中找不到任何项目
  8. deviceiocontrol buffered 返回不了_这3种减肥法是无用功,累死累活也瘦不了
  9. python 字符串赋值操作(分别使用三 种分隔符),Python学习笔记(3)字符串,python,三...
  10. 百度网盘也能BT下载ED2K
  11. java 汉字处理_Java汉字处理
  12. 《数据结构》天勤和王道 第五章 树
  13. 高等数学辅导讲义_历年真题,复习讲义的经验分享(数二127分)
  14. Vue基础知识总结 13:从零开始搭建Vue项目
  15. 用户名枚举/邮箱轰炸攻击
  16. 网页游戏外挂辅助AMF模拟通讯必备
  17. jmeter上传文件踩坑指南
  18. 给高科技强国的后来者埋下的痛
  19. 前端学习之认识HTML
  20. idea 启动项目找不到程序包,提示程序包不存在

热门文章

  1. 肠道微生物群与过敏性鼻炎
  2. 中间件是什么?通俗易懂的解释
  3. 20个励志早会小故事
  4. 2022年茶艺师(初级)考试练习题及模拟考试
  5. UserWarning: Usage of dash-separated ‘script-dir‘ will not be supported in future versions. 笔记
  6. 极速office(word)如何在方框内打钩
  7. 学术会议 Rebuttal 模板
  8. 怎样才能写好一份高质量的市场需求文档(MRD)
  9. 2021-08-27小白笔记3
  10. 苹果退款_销售和退款政策 - Apple (中国大陆)