Qt 實現波浪填充的圓形進度顯示

話不多說,先上效果圖

代碼示例:

#include <QApplication>
#include <QWidget>
#include <QPainter>
#include <QPropertyAnimation>
#include <QTimer>
#include <cmath>class WaveProgressBar : public QWidget
{Q_OBJECTQ_PROPERTY(int value READ value WRITE setValue NOTIFY valueChanged)Q_PROPERTY(qreal wavePhase READ wavePhase WRITE setWavePhase)
public:explicit WaveProgressBar(QWidget *parent = nullptr): QWidget(parent), m_min(0), m_max(100), m_value(0),m_wavePhase(0), m_waveAmplitude(10), m_waveLength(150),m_waveColor(QColor(100, 180, 255)){//設置無邊框和背景透明//setWindowFlags(windowFlags() |  Qt::FramelessWindowHint | Qt::Tool);//setAttribute(Qt::WA_TranslucentBackground);// 波浪相位動畫QPropertyAnimation *waveAnim = new QPropertyAnimation(this, "wavePhase");waveAnim->setDuration(1000);waveAnim->setStartValue(0);waveAnim->setEndValue(m_waveLength);waveAnim->setLoopCount(-1);waveAnim->start();setMinimumSize(150, 150);resize(150, 150);}int value() const { return m_value; }qreal wavePhase() const { return m_wavePhase; }void setValue(int value){value = qBound(m_min, value, m_max);if (m_value != value) {m_value = value;update();emit valueChanged(m_value);}}void setWavePhase(qreal phase){m_wavePhase = phase;update();}void setWaveColor(const QColor &color){m_waveColor = color;update();}void setWaveAmplitude(const qreal amplitude){m_waveAmplitude = amplitude;}signals:void valueChanged(int value);protected:void paintEvent(QPaintEvent *) override{QPainter painter(this);painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);const qreal side = qMin(width(), height());const QRectF rect(0, 0, side, side);const QPointF center = rect.center();const qreal radius = side / 2.0;// 計算填充進度const qreal progress = (m_value - m_min) / static_cast<qreal>(m_max - m_min);const qreal fillHeight = rect.height() * (1 - progress);// 創建統一背景(使用波浪顏色的深色版本)painter.setPen(Qt::NoPen);painter.setBrush(m_waveColor.darker(150));painter.drawEllipse(center, radius, radius);// 創建波浪路徑(始終覆蓋整個圓形)QPainterPath wavePath;const qreal waterLevel = fillHeight;const qreal baseY = rect.top() + waterLevel;wavePath.moveTo(rect.left() - m_waveLength, baseY);// 生成波浪曲線for (qreal x = rect.left() - m_waveLength; x < rect.right() + m_waveLength; x += 1.0) {const qreal phase = (x + m_wavePhase) * M_PI / (m_waveLength / 2.0);const qreal y = baseY + m_waveAmplitude * sin(phase);wavePath.lineTo(x, y);}// 閉合路徑形成填充區域wavePath.lineTo(rect.bottomRight() + QPointF(m_waveLength, 0));wavePath.lineTo(rect.bottomLeft() - QPointF(m_waveLength, 0));wavePath.closeSubpath();// 創建圓形裁剪路徑,控制波浪在圓形區域內QPainterPath clipPath;clipPath.addEllipse(center, radius, radius);painter.setClipPath(clipPath);// 繪制漸變波浪QLinearGradient gradient(rect.topLeft(), rect.bottomLeft());gradient.setColorAt(0, m_waveColor.lighter(120));gradient.setColorAt(1, m_waveColor.darker(120));painter.setBrush(gradient);painter.drawPath(wavePath);// 繪制中心文本painter.setPen(Qt::white);painter.setFont(QFont("Arial", radius * 0.35, QFont::Bold));painter.drawText(rect, Qt::AlignCenter, QString::number(progress * 100, 'f', 0) + "%");}private:int m_min;int m_max;int m_value;qreal m_wavePhase;qreal m_waveAmplitude; //波浪振幅qreal m_waveLength;    //波浪長度QColor m_waveColor;
};int main(int argc, char *argv[])
{QApplication a(argc, argv);static int value = 0;WaveProgressBar progressBar;progressBar.show();QTimer timer;QObject::connect(&timer, &QTimer::timeout, &progressBar, [&progressBar](){ progressBar.setValue(++value);  });timer.start(1000);return a.exec();
}#include "main.moc"

具體實現效果可自由調整,
m_waveColor代表波浪顏色,示例代碼改變m_waveColor亮度繪制背景,可自由修改。
水波效果由波長和振幅控制 “大振幅+長波長=平緩波浪”, “小振幅+短波長=密集波紋”。

通過?waveAnim->setDuration(1000);設置動畫周期可改變水波速度

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/72849.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/72849.shtml
英文地址,請注明出處:http://en.pswp.cn/web/72849.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux vim mode | raw / cooked

注&#xff1a;機翻&#xff0c;未校。 vim terminal “raw” mode Vim 終端 “raw” 模式 1. 原始模式與已處理模式的區別 We know vim puts the terminal in “raw” mode where it receives keystrokes as they are typed, opposed to “cooked” mode where the command…

docker部署dify

1.安裝docker 參考鏈接 https://ascendking.blog.csdn.net/article/details/136407383 設置docker源 vim /etc/docker/daemon.json {"registry-mirrors": ["https://docker.registry.cyou", "https://docker-cf.registry.cyou", "http…

Python Seaborn面試題及參考答案

目錄 如何用 stripplot () 繪制帶隨機偏移的分類散點圖?如何控制 jitter 參數? swarmplot () 如何避免散點重疊?適用場景與數據量限制是什么? 使用 catplot () 繪制箱線圖時,如何通過 kind 參數切換圖表類型? 如何通過 hue 參數在分類圖中添加第三個維度(如性別)? …

Linux應用:Linux的信號

什么是信號 信號是一種軟件中斷&#xff0c;用于通知進程系統中發生了某種特定事件。它是操作系統與進程之間&#xff0c;以及進程與進程之間進行異步通信的一種方式。在 Linux 系統中&#xff0c;信號是一種比較簡單的進程間通信機制。當一個信號產生時&#xff0c;內核會通過…

實時監控、數據分析!Web-Check構建你的網站健康檢測系統實操方案

文章目錄 前言1.關于Web-Check2.功能特點3.安裝Docker4.創建并啟動Web-Check容器5.本地訪問測試6.公網遠程訪問本地Web-Check7.內網穿透工具安裝8.創建遠程連接公網地址9.使用固定公網地址遠程訪問 前言 在數字化運維領域&#xff0c;網站穩定性保障始終是開發者和運維團隊的核…

win32匯編環境,網絡編程入門之八

;在上一教程里&#xff0c;我們學習了簡單的處理服務器返回的數據 ;在這一教程里&#xff0c;我們了解一下&#xff0c;當連接上網站后&#xff0c;應該發送什么數據過去的問題 ;這里有個簡單的方式學習&#xff0c;以下是一個示例 ;我們上網的時候可以用谷歌瀏覽器&#xff0c…

windows 平臺編譯openssl

文章目錄 準備環境安裝perl安裝NASM獲取源碼 源碼編譯配置編譯 準備環境 安裝perl 下載Perl 5.40.0.1 Portable zip strawberryperl 解壓后設置系統環境變量 測試安裝是否成功 perl --versionThis is perl 5, version 40, subversion 0 (v5.40.0) built for MSWin32-x64-m…

一文了解ThreadLocal

什么是ThreadLocal&#xff1f; ThreadLocal是每個線程私有的&#xff0c;線程可以把自己的私有數據放到ThreadLocal里面&#xff0c;不用擔心其他線程訪問到自己ThreadLocal。 通過set()方法將值存入ThreadLocal或者修改值&#xff0c;get()方法取出值&#xff0c;remove()方…

OpenWrt開發第6篇:怎么添加OpenWrt的Package-基于Raspberry Pi 4B開發板

文/指尖動聽知識庫-谷谷 文章為付費內容,商業行為,禁止私自轉載及抄襲,違者必究!!! 文章專欄:Openwrt開發-基于Raspberry Pi 4B開發板 1.如圖1所示,首先創建軟件包所在的目錄,在openwrt根目錄中執行mkdir -p package/mypackages/helloworld命令;

常?CMS漏洞之一:WordPress

WordPress是?個以PHP和MySQL為平臺的?由開源的博客軟件和內容管理系統。WordPress具有插件架構和模板系統。截?2018年4?&#xff0c;排名前1000萬的?站中超過30.6%使?WordPress。 WordPress是最受歡迎的?站 內容管理系統。全球有?約30%的?站(7億5000個)都是使?WordP…

【第17節】windows sdk編程:線程與線程調度

目錄 一、線程 1.1 線程的基本概念 1.2 何時創建線程 二、線程控制 三、遍歷線程 四、線程內核對象 4.1 線程上下文 4.2 暫停次數 4.3 信號 五、線程調度 5.1 什么是線程優先級 5.2 進程優先級與相對線程優先級 5.3 編程改變優先級 5.4 動態優先級的概念 一、線程…

Python數據可視化實戰:從基礎圖表到高級分析

Python數據可視化實戰&#xff1a;從基礎圖表到高級分析 數據可視化是數據分析的重要環節&#xff0c;通過直觀的圖表可以快速洞察數據規律。本文將通過5個實際案例&#xff0c;手把手教你使用Python的Matplotlib庫完成各類數據可視化任務&#xff0c;涵蓋條形圖、堆積面積圖、…

【機器學習-分類算法】

比如將一張圖片按尺寸識別分類為橫向或者縱向兩類就是二分類問題 設x軸為圖像的寬、y軸為圖像的高&#xff0c;那么把訓練數據展現在圖上就是這樣的: 若增加更多的數據集有: 如果只用一條線將圖中白色的點和黑色的點分開,那么: 分類的目的就是找到這條線,就可以根據點在線…

Compose Indication:點擊效果設置

Compose Indication&#xff1a;打造獨特點擊效果的秘密武器 在Compose開發中&#xff0c;大家可能都碰到過Indication&#xff0c;不少人第一次接觸它&#xff0c;是在想去掉Material默認的點擊水波紋效果的時候。要是在AI工具里搜“怎么去掉水波紋效果”&#xff0c;會得到這…

Docker build 會在本地產生巨大的文件

Docker build 會在本地產生巨大的文件&#xff0c; 比如 用 這個命令列出本地鏡像 docker images 可見size都是很大的&#xff0c; 到docker目錄下&#xff0c;看到ext4.vhdx的大小 80多G 那只能用這個命令把不用的鏡像刪掉了&#xff1a; &#xff08;rmi后面是鏡像id&a…

臺式機電腦組裝---電腦機箱與主板接線

臺式機電腦組裝—電腦機箱與主板接線 1、機箱連接主板的跳線一般主要有USB 2.0、USB 3.0、前置音頻接口(HD_AUDIO)以及POWER SW、RESET SW、POWER LED、HDD LED四個主板跳線&#xff0c;這些跳線分別的含義如下。 RESET SW&#xff1a;機箱重啟按鍵&#xff1b;注&#xff1a…

【虛幻引擎UE5】SpawnActor生成Character實例不執行AI Move To,未初始化AIController的原因和解決方法

虛幻引擎版本&#xff1a;5.5.4 問題描述 剛創建的Third Person項目里&#xff0c;定義一個BP_Enemy藍圖&#xff0c;拖拽到場景中產生的實例會追隨玩家&#xff0c;但SpawnActor產生的實例會固定不動。BP_Enemy藍圖具體設計如下&#xff1a; BP_Enemy的Event Graph ?? 又定義…

跨平臺RTSP高性能實時播放器實現思路

跨平臺RTSP高性能實時播放器實現思路 目標&#xff1a;局域網100ms以內超低延遲 一、引言 現有播放器&#xff08;如VLC&#xff09;在RTSP實時播放場景中面臨高延遲&#xff08;通常數秒&#xff09;和資源占用大的問題。本文提出一種跨平臺解決方案&#xff0c;通過網絡層…

HTTP 失敗重試(重發)方案

在 Qt 網絡開發中&#xff0c;使用 QNetworkAccessManager 進行 HTTP 請求時&#xff0c;可能會遇到網絡超時、服務器錯誤等情況。為了提高請求的可靠性&#xff0c;可以實現 HTTP 失敗重試&#xff08;重發&#xff09; 機制。下面介紹幾種常見的 失敗重發方案&#xff1a; 單…

大白話詳細解讀React框架的diffing算法

1. Diffing 算法是什么&#xff1f; Diffing 算法是 React 用來比較虛擬 DOM&#xff08;Virtual DOM&#xff09;樹的一種算法。它的作用是找出前后兩次渲染之間的差異&#xff08;diff&#xff09;&#xff0c;然后只更新這些差異部分&#xff0c;而不是重新渲染整個頁面。 …