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_())

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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyQt 是一个用于创建GUI应用程序的Python库,可以用于创建各种函数丰富的窗口。要使用PyQt创建带有进度条的弹窗,我们可以按照以下步骤进行操作: 1. 导入PyQt库中的必要模块,比如`QtWidgets`和`QtCore`。 2. 创建一个继承自`QDialog`的自定义窗口类。该类将包含进度条和其他所需的组件。 3. 在自定义窗口类的构造函数中,设置窗口的初始属性,比如标题、大小和布局。 4. 创建一个进度条组件,并将其添加到窗口布局中。 5. 创建一个用于更新进度条的槽函数。槽函数将使用`setValue()`方法来更新进度条的值。 6. 向窗口中添加一个按钮,并将其与槽函数关联。 7. 使用`QThread`类创建一个新的线程,并将其关联到自定义窗口类的槽函数上。 8. 在线程的执行函数中,通过循环和适当的延迟,逐渐增加进度条的值。 9. 运行应用程序主循环,显示弹窗。 下面是一个简单的示例代码,实现了上述步骤中的操作: ``` from PyQt5.QtWidgets import QApplication, QDialog, QProgressBar, QPushButton, QVBoxLayout from PyQt5.QtCore import QThread, pyqtSignal, QTimer class MyDialog(QDialog): def __init__(self): super().__init__() self.setWindowTitle("进度条弹窗") self.resize(300, 100) layout = QVBoxLayout(self) self.progressbar = QProgressBar() layout.addWidget(self.progressbar) button = QPushButton("开始") layout.addWidget(button) button.clicked.connect(self.start_progress) self.timer = QTimer(self) self.timer.timeout.connect(self.update_progress) self.thread = MyThread() def start_progress(self): self.timer.start(100) self.thread.start() def update_progress(self): value = self.progressbar.value() if value < 100: self.progressbar.setValue(value + 10) else: self.timer.stop() class MyThread(QThread): def run(self): for i in range(11): self.msleep(100) self.quit() if __name__ == "__main__": app = QApplication([]) dialog = MyDialog() dialog.show() app.exec_() ``` 以上代码创建了一个简单的弹窗窗口,其中包含一个进度条和一个用于触发进度更新的按钮。单击按钮后,会启动一个新的线程,并在定时器的帮助下逐渐增加进度条的值。当进度条达到100时,定时器停止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值