PyQt5 – 改变进度条的边框

  • Post category:Python

下面是Python的PyQt5中,如何改变进度条的边框的完整使用攻略,进度条的边框是指进度条的外围线条:

  1. PyQ5中进度条的边框样式常用的属性是QProgressBar::chunk,可以通过设置此属性的值更改进度条边框的样式,如下所示:
import sys
from PyQt5.QtWidgets import QApplication, QProgressBar, QWidget


class MyProgressBar(QWidget):
    def __init__(self, parent=None):
        super(MyProgressBar, self).__init__(parent)
        self.initUI()

    def initUI(self):
        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('PyQt5 - 改变进度条的边框')

        self.progressBar = QProgressBar(self)
        self.progressBar.setGeometry(20, 50, 200, 30)
        self.progressBar.setValue(50)

        self.show()

        # 设置进度条的边框
        style = """
            QProgressBar {
                border: 2px solid green;
                border-radius: 5px;
                text-align: center;
            }

            QProgressBar::chunk {
                background-color: #CD96CD;
                height: 20px;
                border-radius: 5px;
            }
        """
        self.progressBar.setStyleSheet(style)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = MyProgressBar()
    sys.exit(app.exec_())

在上面的代码中,我们创建了一个自定义窗口类MyProgressBar,将进度条添加到窗口中,然后通过setStyleSheet()方法来设置进度条的边框,使用CSS的样式来定义边框。

其中,在样式表中,我们使用QProgressBar::chunk来指定进度条的样式,设置了进度条的边框线条颜色、宽度、高度和边缘半径。你可以根据需要,修改样式表中的属性来适配自己的应用场景。

  1. 另一种改变进度条的边框的方式是,利用QStyle类的drawControl()方法,通过绘制动态边框来实现。具体代码如下:
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPainter, QColor, QPen
from PyQt5.QtWidgets import *


class MyProgressBar(QWidget):
    def __init__(self, parent=None):
        super(MyProgressBar, self).__init__(parent)
        self.initUI()

    def initUI(self):
        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('PyQt5 - 改变进度条的边框')

        self.progressBar = QProgressBar(self)
        self.progressBar.setGeometry(20, 50, 200, 30)
        self.progressBar.setValue(50)

        self.show()

    def paintEvent(self, event):
        # 利用QStyle类的drawControl()方法,绘制动态边框
        opt = QStyleOptionProgressBarV2()
        opt.initFrom(self.progressBar)
        opt.rect = self.progressBar.rect()
        opt.text = ''

        painter = QPainter(self)
        self.style().drawControl(QStyle.CE_ProgressBarGroove, opt, painter, self.progressBar)
        self.style().drawControl(QStyle.CE_ProgressBarContents, opt, painter, self.progressBar)

        progress = self.progressBar.value() * (opt.rect.width() - 2) / self.progressBar.maximum()

        r = QRect(opt.rect)
        r.setWidth(progress)
        r.setHeight(opt.rect.height() - 2)

        if progress > 0:
            self.style().drawControl(QStyle.CE_ProgressBarContents, opt, painter, self.progressBar)

        pen = QPen(QColor('green'))
        pen.setWidth(2)
        painter.setPen(pen)
        painter.drawRect(r.adjusted(0, 0, -1, -1))


if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = MyProgressBar()
    sys.exit(app.exec_())

在上面的代码中,我们重新实现了自定义窗口类MyProgressBar中的paintEvent()方法,其中通过QStyle类的drawControl()方法,绘制出了进度条的动态边框,然后使用QPainter类绘制出矩形边框,并调整矩形宽度和高度,最后使用QPen类来定义矩形边框的颜色、宽度,最后绘制出来。

总之,在Python的PyQt5中改变进度条的边框,实现方法有很多,可以根据需求和实际情况,选择适合自己的方法。