📜  PyQt5 - 进度条的皮肤到条(1)

📅  最后修改于: 2023-12-03 15:18:47.260000             🧑  作者: Mango

PyQt5 - 进度条的皮肤到条

介绍

在PyQt5中,我们可以使用进度条来显示进度和过程。但是,进度条默认的样式和颜色可能不适合某些应用程序的主题和视觉需求。在这种情况下,我们可以通过更改进度条的皮肤来自定义它的外观。本文将介绍如何在PyQt5中更改进度条的皮肤。

步骤
1. 导入必要的模块
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
2. 创建进度条
progress_bar = QProgressBar()
3. 设置进度条的皮肤

3.1 通过样式表设置皮肤

可以使用样式表来为进度条定义自定义样式。

progress_bar.setStyleSheet("""
    QProgressBar {
        border: 1px solid grey;
        border-radius: 5px;
        text-align: center;
    }
    QProgressBar::chunk {
        background-color: #CD96CD;
        width: 10px;
    }
""")

在这个例子中,我们为进度条设置了灰色边框和圆角,使用紫红色作为进度条的背景颜色,并将进度条的粗细设置为10像素。

3.2 通过自定义绘制方法设置皮肤

如果您想要更大的灵活性来自定义进度条的外观,那么您可以通过编写自定义绘制方法来设置皮肤。在这种情况下,您需要创建一个继承自QProgressBar的自定义进度条类,并覆盖paintEvent方法。

class CustomProgressBar(QProgressBar):
    def __init__(self, parent=None):
        super(CustomProgressBar, self).__init__(parent)

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

        # 绘制背景
        rect = QRectF(0, 0, self.width(), self.height())
        painter.setBrush(QColor("#F0F0F0"))
        painter.drawRoundedRect(rect, 5, 5)

        # 绘制进度条
        progress_rect = QRectF(0, 0, (self.value() / self.maximum()) * self.width(), self.height())
        painter.setBrush(QColor("#CD96CD"))
        painter.drawRoundedRect(progress_rect, 5, 5)

        # 绘制文本
        painter.setPen(QColor("#333333"))
        painter.setFont(QFont("Arial", 10))
        painter.drawText(rect, Qt.AlignCenter, "{}%".format(int((self.value() / self.maximum()) * 100)))

在这个例子中,我们定义了一个名为CustomProgressBar的自定义QProgressBar类,并覆盖了paintEvent方法。在paintEvent方法中,我们使用QPainter对象来绘制进度条的背景、进度条和文本。最后,我们将进度条类设置为CustomProgressBar。

progress_bar = CustomProgressBar()
完整代码
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *

class CustomProgressBar(QProgressBar):
    def __init__(self, parent=None):
        super(CustomProgressBar, self).__init__(parent)

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

        # 绘制背景
        rect = QRectF(0, 0, self.width(), self.height())
        painter.setBrush(QColor("#F0F0F0"))
        painter.drawRoundedRect(rect, 5, 5)

        # 绘制进度条
        progress_rect = QRectF(0, 0, (self.value() / self.maximum()) * self.width(), self.height())
        painter.setBrush(QColor("#CD96CD"))
        painter.drawRoundedRect(progress_rect, 5, 5)

        # 绘制文本
        painter.setPen(QColor("#333333"))
        painter.setFont(QFont("Arial", 10))
        painter.drawText(rect, Qt.AlignCenter, "{}%".format(int((self.value() / self.maximum()) * 100)))

app = QApplication([])
progress_bar = CustomProgressBar()
# progress_bar.setStyleSheet("""
#     QProgressBar {
#         border: 1px solid grey;
#         border-radius: 5px;
#         text-align: center;
#     }
#     QProgressBar::chunk {
#         background-color: #CD96CD;
#         width: 10px;
#     }
# """)
progress_bar.setRange(0, 100)
progress_bar.setValue(60)
progress_bar.show()
app.exec_()
结论

在本文中,我们介绍了如何在PyQt5中更改进度条的皮肤。通过使用样式表或编写自定义绘制方法,我们可以自定义进度条的外观以满足应用程序的需求。