📜  PyQt5 - 如何在进度条中添加边距(1)

📅  最后修改于: 2023-12-03 14:45:45.876000             🧑  作者: Mango

PyQt5 - 如何在进度条中添加边距

在 PyQt5 中,我们可以使用 QProgressBar 来显示进度条。默认情况下,进度条是占满整个控件区域的。但是,有时候我们可能需要在进度条周围添加一些边距来提高美观性和可读性。

那么,如何在 PyQt5 中给进度条添加边距呢?我们可以通过两种方式来实现。

方法一:使用样式表

Qt 中的控件可以使用样式表来设置样式,包括控件的颜色、大小等。我们可以利用这个功能来为进度条设置边距。

以下是一个示例代码:

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QProgressBar

class App(QWidget):

    def __init__(self):
        super().__init__()
        self.title = 'PyQt5 Progress Bar with Padding'
        self.left = 100
        self.top = 100
        self.width = 480
        self.height = 100
        self.initUI()

    def initUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)

        progress_bar = QProgressBar(self)
        progress_bar.setGeometry(20, 20, 440, 60)
        progress_bar.setValue(50)

        # 使用样式表来为进度条添加边距
        style = """
            QProgressBar {
                border: 2px solid grey;
                border-radius: 5px;
                text-align: center;
            }

            QProgressBar::chunk {
                background-color: lightblue;
                width: 20px;
                margin: 5px;
            }
        """
        progress_bar.setStyleSheet(style)

        self.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = App()
    sys.exit(app.exec_())

在上面的代码中,我们首先定义了一个样式表,其中 QProgressBar 设置了一个 2 像素宽的灰色边框和 5 像素宽的边距。QProgressBar::chunk 是指进度条中的已完成部分,我们为其设置了一个浅蓝色背景和 5 像素宽的外边距。

方法二:自定义进度条

如果你想要更灵活地控制进度条的边距,可以通过自定义进度条来实现。以下是一个示例代码:

import sys
from PyQt5.QtCore import Qt, QRect, QSize, QTimer
from PyQt5.QtGui import QColor, QPainter
from PyQt5.QtWidgets import QApplication, QProgressBar, QWidget

class FadingProgressBar(QProgressBar):

    def __init__(self, parent=None):
        super().__init__(parent)
        self._border_color = QColor(211, 211, 211)
        self._border_width = 2
        self._border_radius = 5
        self._margin = 5
        self._offset = 0
        self._timer = QTimer(self)
        self._timer.setInterval(50)
        self._timer.timeout.connect(self._animate_offset)
        self._timer.start()

    def paintEvent(self, event):
        painter = QPainter(self)
        painter.setRenderHint(QPainter.Antialiasing)

        # 绘制边框
        path = self._border_path()
        painter.setPen(self._border_color)
        painter.drawPath(path)

        # 绘制进度条
        progress_rect = self._progress_rect()
        if progress_rect.width() > 0:
            painter.fillRect(progress_rect, self.palette().highlight())

        # 绘制文本
        text = self.text()
        if not text:
            return

        text_rect = self._text_rect()
        painter.setFont(self.font())
        painter.drawText(text_rect, Qt.AlignCenter, text)

    def _animate_offset(self):
        self._offset = (self._offset + 1) % (2 * self._margin)
        self.repaint()

    def _border_path(self):
        border_rect = QRect(self.rect().x(),
                            self.rect().y(),
                            self.rect().width()-1,
                            self.rect().height()-1)
        path = QPainterPath()
        path.addRoundedRect(border_rect, self._border_radius, self._border_radius)
        return path

    def _progress_rect(self):
        progress_rect = self.rect().adjusted(
            self._margin + self._border_width,
            self._margin + self._border_width,
            -(self._margin + self._border_width),
            -(self._margin + self._border_width))
        progress_rect.setWidth(int(progress_rect.width() * float(self.value()) / self.maximum()))
        return progress_rect.translated(self._offset - self._margin - self._border_width, 0)

    def _text_rect(self):
        return self.rect().adjusted(0, self._margin + self._border_width, 0, -(self._margin + self._border_width))

class App(QWidget):

    def __init__(self):
        super().__init__()
        self.title = 'PyQt5 Progress Bar with Padding'
        self.left = 100
        self.top = 100
        self.width = 480
        self.height = 100
        self.initUI()

    def initUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)

        progress_bar = FadingProgressBar(self)
        progress_bar.setGeometry(20, 20, 440, 30)
        progress_bar.setValue(50)

        self.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = App()
    sys.exit(app.exec_())

在上面的代码中,我们定义了一个名为 FadingProgressBar 的自定义进度条。它通过重写 paintEvent() 方法来实现绘制。我们可以通过以下几个属性来控制进度条的边距:

  • _border_color: 边框颜色
  • _border_width: 边框宽度
  • _border_radius: 边框圆角半径
  • _margin: 外边距

此外,我们还创建了一个定时器来实现进度条中进度条块的闪烁动画效果。

以上就是在 PyQt5 中给进度条添加边距的两种方法。根据实际需要选择合适的方法即可。