改变QProgressBar的颜色

16
我正在运行Ubuntu 11.04。这是我的进度条外观: progress bar 我在批处理窗口中显示进度条(每个批处理项一个),并希望将其用作状态指示器(全部进行良好时为绿色,出现错误时为红色等)。
我尝试了几个建议,包括对几乎相同问题的这个问题所做的建议。不幸的是,我无法使它工作,也不能从自定义QProgressBars的文档中得到帮助,因此如果您能提供任何有关我做错了什么的建议,我将非常感激。
我已经按建议对QProgressBar进行了子类化,并尝试使用样式表和调色板(但不同时使用)。使用样式表,我无法使其看起来与常规进度条一样。更改颜色确实是我想要做的所有事情,所以我认为使用调色板而不是样式表应该更容易实现,但是使用调色板根本没有发生任何事情。
这是我尝试过的调色板版本之一:
#include "myprogressbar.h"

#include <QtGui/QPalette>

MyProgressBar::MyProgressBar(QWidget *parent) :
    QProgressBar(parent)
{}

void MyProgressBar::onProgress(int value, int maximum, QString phase)
{
    setMaximum(maximum);
    setValue(value);
    setFormat(phase);

    QPalette p = this->palette();
    p.setColor(QPalette::Highlight, QColor(Qt::green));
    this->setPalette(p);
}

...

我也尝试了这里建议的版本,但那也没有帮助。


palettesetPalette 的文档中写道:警告:不要与 Qt 样式表一起使用此函数。也许这就是问题所在?如果是这样,您可以尝试使用 stylesetStyle。但这只是我的猜测。 - Frg
1
如果您使用样式表,则必须设置所有内容,而不仅仅是单个元素。请展示您尝试过的样式表。 - koan
@Frg 我还没有将调色板与样式表一起使用过,但是分别使用过(请参见编辑)。 - steps
@koan 我知道这一点。但是我发现很难通过样式表生成一个外观,使其与“本机”进度条仅在进度条颜色方面有所不同。 - steps
2
@步骤,每个人都是如此。如果您不触摸样式,则Qt使用本机小部件,但如果您使用样式,则必须自己绘制小部件;这就是为什么您不能简单地更改单个颜色的原因。 - koan
显示剩余5条评论
3个回答

15

我尝试了这个:

QProgressBar {
     border: 2px solid grey;
     border-radius: 5px;
     background-color: #FF0000;
 }

 QProgressBar::chunk {
     background-color: #05B8CC;
     width: 20px;
 }

我为进度条设置了一个样式表,结果是这个enter image description here

因此,你可以很容易地将条的背景更改为所需颜色,并使用setFormat()自行显示文本。这对你有用吗?


是的,那对我来说可行。但正如我所说,我发现使用样式表创建外观非常接近常规进度条很难。这就是为什么我希望使用调色板解决问题。不过还是谢谢你的回答! - steps
在哪里编写这些代码?或者怎样添加它!谢谢。 - McLan
1
请确保不要删除边框设置,否则它将忽略背景颜色! - Jesse Elliott
@McLan,Arwen的回答告诉你如何使它工作:即progressbar->setStyleSheet(...) - Alexis Wilke

7
我也遇到了这个问题,但我找到了一个方法,在这个网站http://thesmithfam.org/blog/2009/10/13/cool-qprogressbar-stylesheet/的帮助下:
但我只想改变颜色而不是进度条本身。所以我删掉了第一行,稍微修改了第二行。
最终我得到了我想要的结果。
首先要做这个:
QString danger = "QProgressBar::chunk {background: QLinearGradient( x1: 0, y1: 0, x2: 1, y2: 0,stop: 0 #FF0350,stop: 0.4999 #FF0020,stop: 0.5 #FF0019,stop: 1 #FF0000 );border-bottom-right-radius: 5px;border-bottom-left-radius: 5px;border: .px solid black;}";
QString safe= "QProgressBar::chunk {background: QLinearGradient( x1: 0, y1: 0, x2: 1, y2: 0,stop: 0 #78d,stop: 0.4999 #46a,stop: 0.5 #45a,stop: 1 #238 );border-bottom-right-radius: 7px;border-bottom-left-radius: 7px;border: 1px solid black;}";

现在你需要做的是:
if(ui->progressbar->value()<80)
    ui->progressbar->setStyleSheet(danger);
else
    ui->progressbar->setStyleSheet(safe);

7
在我的情况下,使用“高亮”颜色的角色(使用Plastique样式)会起到作用。
QPalette p = palette();
p.setColor(QPalette::Highlight, Qt::green);
setPalette(p);

2
如果你想要为进度条设置背景样式,可以使用 p.setColor(QPalette::Base, Qt::red); - Nicolas Holthaus
3
很遗憾,GTK样式完全忽略了这一点。 - Daniel Kamil Kozar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接