分享一个圆形进度条
参考的是https://www.5axxw.com/questions/content/ggx5qp
progressBar.py
from PyQt5.QtCore import QRectF, Qt
from PyQt5.QtGui import QFont, QResizeEvent, QPainter, QPen, QConicalGradient, QColor
from PyQt5.QtWidgets import QFrame
class ProgressBar(QFrame):
def __init__(self, parent=None):
super().__init__(parent=parent)
self.progress = 0
self.text = ''
self.win_size = self.size()
self.font = QFont('微软雅黑', 12)
def setValue(self, n: int):
if self.progress == n:
return
else:
self.progress = n
self.update()
def setFont(self, font: QFont) -> None:
self.font = font
self.update()
super().setFont(font)
def setText(self, text):
self.text = text
self.update()
def resizeEvent(self, evt: QResizeEvent) -> None:
self.win_size = evt.size()
super().resizeEvent(evt)
def paintEvent(self, e):
self.resize(self.win_size)
pd = int(self.progress / 100 * 360)
painter = QPainter(self)
# 填充
# painter.fillRect(self.rect(), Qt.white)
painter.translate(10, 10)
painter.setRenderHint(QPainter.Antialiasing)
# 圆坐标
circle_rect = QRectF(self.rect().left() / 2, self.rect().top() / 2, self.width() - 20, self.height() - 20)
painter.setPen(QPen(QColor(173, 173, 173, 150), 3))
painter.drawEllipse(circle_rect) # 画内圆
# 渐变色
gradient = QConicalGradient(50, 50, 0)
gradient.setColorAt(0.2, QColor('#12c2e9'))
gradient.setColorAt(0.4, QColor('#c471ed'))
gradient.setColorAt(0.6, QColor('#f64f59'))
gradient.setColorAt(0.8, QColor('#c471ed'))
gradient.setColorAt(1, QColor('#12c2e9'))
# 外圈圆
pen = QPen()
pen.setCapStyle(Qt.RoundCap) # 设置圆帽
pen.setWidth(8) # 笔宽度
pen.setBrush(gradient)
painter.setPen(pen)
painter.drawArc(circle_rect, (90 - 0) * 16, int(-pd * 16)) # 画圆环
# 设置字体
painter.setFont(self.font)
sizeF = self.font.pointSizeF() + 10
text_width = (len(self.text) + 4) * sizeF
# 设置文本大小与宽度
rectF = QRectF(
(self.win_size.width() - 20 - text_width) / 2,
(self.win_size.height() - 20 - sizeF) / 2,
text_width, sizeF
)
painter.drawText(rectF, Qt.AlignCenter, self.text + "%d%%" % int(self.progress)) # 显示进度条当前进度
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
win = ProgressBar()
win.resize(100, 125)
win.setValue(50)
win.show()
sys.exit(app.exec_())
示例图