pyqt圆形进度条

分享一个圆形进度条
参考的是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_())

示例图
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值