更改QProgressbar()的颜色

4 投票
1 回答
22919 浏览
提问于 2025-04-16 19:10

我在想,能不能改变PyQt进度条的颜色呢?

我有以下这段代码:

from PyQt4 import QtGui, QtCore
Pbar1 = QtGui.QProgressBar()
Pbar1.setParent(Frame1)
Pbar1.setGeometry(0, 0, 306, 30)
Pbar1.setValue(Frame1Value)
if Pbar1.value == 100
......Pbar1.setColor(Red)

Frame1Value的值是根据一些早期的计算得出的,假设这个值不会完全相同。

我希望当值达到100时,进度条能变成“红色”(因为进度条的值上限是100%,所以不会显示超过100%的值),这样可以更直观地告诉我这个值“超出了限制”。

我知道进度条没有.setColor这个命令,但我只是想表达我的想法。

有没有人知道怎么做到这一点,或者说这是否可能呢?

提前谢谢大家!

1 个回答

9

你可以通过创建一个QProgressBar的子类,并使用一些样式表来进行自定义。具体可以参考这两个链接:使用样式表自定义Qt小部件自定义QProgressBar

from PyQt4 import QtGui, QtCore

DEFAULT_STYLE = """
QProgressBar{
    border: 2px solid grey;
    border-radius: 5px;
    text-align: center
}

QProgressBar::chunk {
    background-color: lightblue;
    width: 10px;
    margin: 1px;
}
"""

COMPLETED_STYLE = """
QProgressBar{
    border: 2px solid grey;
    border-radius: 5px;
    text-align: center
}

QProgressBar::chunk {
    background-color: red;
    width: 10px;
    margin: 1px;
}
"""

class MyProgressBar(QtGui.QProgressBar):
    def __init__(self, parent = None):
        QtGui.QProgressBar.__init__(self, parent)
        self.setStyleSheet(DEFAULT_STYLE)

    def setValue(self, value):
        QtGui.QProgressBar.setValue(self, value)

        if value == self.maximum():
            self.setStyleSheet(COMPLETED_STYLE)

未完成 已完成

另一种解决方案是给QProgressBar重新分配一个调色板,这样你就可以拥有一个“样式感知”的组件。

class MyProgressBar(QtGui.QProgressBar):
    def setValue(self, value):
        QtGui.QProgressBar.setValue(self, value)
        if value == self.maximum():
            palette = QtGui.QPalette(self.palette())
            palette.setColor(QtGui.QPalette.Highlight, 
                             QtGui.QColor(QtCore.Qt.red))
            self.setPalette(palette)

撰写回答