Qt之實現(xiàn)圓形進度條的示例代碼
在Qt自帶的控件中,只有垂直進度條、水平進度條兩種。
在平時做頁面開發(fā)時,有些時候會用到圓形進度條,比如說:下載某個文件的下載進度。
展示效果,如下圖所示:
實現(xiàn)這個功能主要由以下幾個重點:
1:圖形繪制
2:數(shù)值計算
也算是一個初級例子,下面我來講解下如何實現(xiàn)這個簡單的小功能吧!
功能
自定義繪制類:QRoundedProgress
繼承自QWidget
圖形繪制
1.繪制窗口整體背景色值
QPainter painter(this); painter.fillRect(this->rect(), m_crBack); painter.setRenderHint(QPainter::Antialiasing); //抗鋸齒
m_crBack:窗口背景色,默認(rèn)是 QColor(255, 255, 255);
因為后續(xù)要繪制圓形,在繪制之前加上抗鋸齒效果。
2.圓形進度條通道繪制
什么叫做圓形進度條的通道呢?
如圖所示的灰色區(qū)域就是圓形進度條的通道,也就是我們說的圓環(huán)。
實現(xiàn)方式:兩個半徑不同的圓重疊在一起(且圓心相同),未重疊的部分也就是圓形的通道區(qū)域。
假設(shè)QRoundedProgress類大小是:QSize(100, 100),也就是說該窗口的寬度=100,高度=100。
大圓形代碼:
painter.setPen(m_crProgressChannel); painter.setBrush(m_crProgressChannel); painter.drawEllipse(this->rect());
以整個窗口作為圓形的區(qū)域進行繪制,顯示效果如下:
m_crProgressChannel:通道號顏色值,默認(rèn)是 QColor(220, 220, 220);
小圓形代碼:
QRect rectInCircl = this->rect(); rectInCircl.adjust(10, 10, -10, -10); painter.setPen(m_crBack); painter.setBrush(m_crBack); painter.drawEllipse(rectInCircl);
以窗口的整體區(qū)域為標(biāo)準(zhǔn),向內(nèi)調(diào)整10個像素大小,采用了QRect::adjust方法。
10就是圓環(huán)的寬度了。
3.圓形進度條繪制
進度條也就是在文章最開始gif動畫中藍(lán)色的動態(tài)條。
該如何簡單的繪制整個進度呢?
最簡單的方式:采用QPainter扇形的繪制方式!
在程序中,進度條的變化可以采用扇形的區(qū)域進行表示。隨著數(shù)據(jù)的變化,扇形的面積也逐漸遞增,直到達到設(shè)定的最大值為止。
該如何繪制呢?
要是繪制一個實心的扇形,直接在小圓形代碼后面追加肯定是不行的,會出現(xiàn)下面的效果:
小圓形直接被覆蓋住了,這樣的效果與文章最開始的展示效果是不一致的。
修改方式:將扇形繪制的方法放置到大圓形、小圓形代碼之間
繪制扇形代碼如下:
painter.setPen(m_crProgressBar); painter.setBrush(m_crProgressBar); painter.drawPie(this->rect(), 90 * 16, -m_nValue * m_fStep * 16);
m_crProgressBar:圓形進度條顏色值,默認(rèn)是 QColor(16, 142, 233);
4.文本繪制
圖形繪制完成后,最后繪制文本展示
painter.setFont(m_font); painter.setPen(m_crText); painter.drawText(rectInCircl, Qt::AlignHCenter| Qt::AlignVCenter, m_sValue);
數(shù)值計算
在圓形進度條中需要設(shè)置以下幾種計算
1.計算步長
m_fStep = 360.0/ (maximum - minimum);
根據(jù)步長大小,計算每次移動的扇面面積
painter.drawPie(this->rect(), 90 * 16, -m_nValue * m_fStep * 16);
通常情況下,圓形進度條的走向一般是順時針,但是,在圓形中走向卻是逆時針方向,所以在進行扇形面積計算時,會從90°逆向繪制。
2.實時數(shù)據(jù)計算
由外界調(diào)用者傳入實時變化數(shù)據(jù),并計算當(dāng)前加載的百分比數(shù)值。
float fNum = (value*1.0) / (m_nMaxMum - m_nMinMum); m_sValue = QString::number(fNum*100, 'f', 0) + QStringLiteral("%");
其中,m_sValue該變量是應(yīng)用到drawText中文本繪制的。
到這里,簡單的圓形進度條就繪制完成了~
到此這篇關(guān)于Qt之實現(xiàn)圓形進度條的示例代碼的文章就介紹到這了,更多相關(guān)Qt 圓形進度條內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!