聖誕節到了!!你的桌面下雪了嗎?? - Qt趣味開發之讓你的桌面下雪
聖誕節到了,寫個桌面下雪的程式慶祝一下。過節也是要有儀式感的!!
顯示效果如下:
具有如下功能:
- 托盤選單,可以配置、關於作者、退出。
- 可以配置是否下雪、煙花效果,配置雪的濃度和下降的速度。
完整程式碼和可執行程式下載:
可執行程式:
連結:https://pan.baidu.com/s/1NMod82jHwLsZE944Tl7KSg
提取碼:ne9u
原始碼下載:
連結:https://pan.baidu.com/s/1_Wq7zyG_R24HkJUX9uTXbw
提取碼:ragy
1. 下雪的實現
這裡下雪和煙花的效果都是用的QML實現的,其中煙花的效果可以參考這篇文章:
https://blog.csdn.net/yafeilinux/article/details/86530616
下雪的效果,使用的QML的粒子
下面貼出部分關鍵程式碼:
import QtQuick 2.12
import QtQuick.Controls 2.12
import QtQuick.Particles 2.12
Rectangle {
id: rootRect
objectName: "rootRect"
color: Qt.rgba(0, 0, 0, 0.01);
ParticleSystem{
id: particleSystem
objectName: "particleSystem"
}
Emitter {
id: particleEmitter
objectName: "particleEmitter"
system: particleSystem
anchors.top: parent.top
anchors.horizontalCenter: parent.horizontalCenter
width: parent.width
height: 1
emitRate: 10
lifeSpan: 10000
lifeSpanVariation: 100
size: 25
sizeVariation: 5
endSize: 20
velocity: CumulativeDirection {
AngleDirection {
objectName: "sonwVelocity"
angle: 90
angleVariation: 10
magnitude: 200
magnitudeVariation: 20
}
}
acceleration: AngleDirection{
angle: 90
magnitude: 25
}
}
ImageParticle {
system: particleSystem
source: "file:///D:/Image/star.png"
// alpha: 0
// colorVariation: 0.2
rotation: 0
rotationVariation: 10
rotationVelocity: 90
rotationVelocityVariation: 10
entryEffect: ImageParticle.Scale
}
Turbulence {
system: particleSystem
anchors.left: parent.left
anchors.verticalCenter: parent.verticalCenter
width: parent.width
height: parent.height / 2
strength: 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);
});
微信公眾號:不會飛的紙飛機
不定時更新技術文章
相關文章
- 聖誕節快到了,快來裝飾你的Mac電腦桌面吧!Mac
- 聖誕節快到啦!Mac電腦系統如何在聖誕節讓電腦螢幕下雪?Mac
- 聖誕螢幕下雪動態效果Xmas snow for macMac
- 聖誕夜,讓你的程式碼都變成聖誕樹吧!
- 敢曬出你的桌面嗎?
- Xmas snow for mac( 聖誕螢幕下雪動態效果)v1.5.3啟用版Mac
- 《真·簡單》Golang 輕量級桌面程式 wails 庫(聖誕節限定)GolangAI
- 火螢醬 | 讓你的桌面就是醬的效率!
- 為了讓你高效工作,華為雲桌面是這樣做的
- 快到聖誕節了,用python來給自己的頭像加上一頂聖誕帽Python
- 把你的程式放到桌面——Android桌面部件WidgetAndroid
- 今天你過節了嗎?
- 純css模擬下雪效果CSS
- 最美聖誕樹!用Python畫棵雪夜聖誕樹送給你Python
- java web開發這些細節你真的掌握了嗎JavaWeb
- 【前端詞典】實現 Canvas 下雪背景引發的效能思考前端Canvas
- Clash聖誕節取消!《部落衝突》&《皇室戰爭》“滾木聖誕節” 狂歡開場
- 程式設計師的聖誕節--送她一顆聖誕樹(附原始碼)程式設計師原始碼
- 程式設計師的聖誕節–送她一顆聖誕樹(附原始碼)程式設計師原始碼
- 聖誕節的python豪華版聖誕樹,包括雪花彩燈文字背景Python
- 5款Linux桌面環境,你都瞭解嗎?Linux
- 「程式設計師小漫畫」 之 程式設計師眼中的聖誕節和萬聖節程式設計師
- AntD 聖誕節彩蛋事件事件
- 想讓你的Mac桌面乾淨整潔?試試桌面圖示及檔案整理工具iCollectionsMac
- Java開發桌面程式學習(八)——開源庫 JFXUtils 讓你更簡單地進行JavaFX開發Java
- fallingsnow.js-jquery下雪動畫特效JSjQuery動畫特效
- 這個隱瞞了100多天的彩蛋,在聖誕節搞丟了一群開發者的飯碗
- cloudcone聖誕節開始推出自帶BBR加速的系統Cloud
- 香檳中的冠軍,你猜到了嗎?
- 好用便籤電腦版:讓你的桌面成為高效記錄小天地
- 強大的CSS:模擬下雪效果動畫製作教程CSS動畫
- 你真的瞭解到了有效的微信域名防封防紅了嗎
- 故宮下雪之後!我花了45秒,用Python給它畫了一組手繪圖Python繪圖
- 聖誕鬧劇!阿里旗下開源專案聖誕彩蛋遭開發者狂批阿里
- Notification API,為你的網頁新增桌面通知推送API網頁
- 這些前端框架,讓你的開發更高效率,高質量,你用過嗎?前端框架
- 聖誕節如何打造新穎的郵件營銷?
- 雙十一到了,你的ERP準備好了嗎?