Change the color of a QProgressBar
Asked Answered
P

3

17

I am running ubuntu 11.04. This is what my progress bars look like:

progress bar

I am showing the progress bars in a batch processing window (one per batch item) and would like to use them as a status indicator (green while all is going well, red in case of errors, ...).

I have tried several suggestions, including the ones made to this almost identical question. Unfortunately, I couldn't make it work and the documentation on customizing QProgressBars doesn't help me either, so I would be very grateful for any suggestions as to what I'm doing wrong.

I have subclassed the QProgressBar as suggested and have tried using stylesheets as well as the palette (not at the same time but as alternatives). With stylesheets, I can't make it look anything like the regular progress bars. Changing the color is really all I want to do, so I figured it should be much easier to do that by use of a palette instead of a stylesheet, but with the palette nothing happens at all.

Here is one of the versions I've tried for the palette:

#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);
}

...

I also tried the version suggested here, but that didn't help either.

Philippa answered 20/2, 2012 at 21:40 Comment(10)
Documentation on palette and setPalette says: Warning: Do not use this function in conjunction with Qt Style Sheets. Maybe that's the problem? In that case you could try style and setStyle. But that's just my guess.Helot
What is your OS? How does the progress bar look like in it?Envelopment
If you use style sheets then you have to set everything not just a single element. Show us the style sheet you tried.Fishbein
@Helot I haven't used palettes in conjunction with style sheets but separately (see edit).Philippa
@Fishbein I know that. But I find it difficult to generate a look via stylesheets that differs from the "native" progess bars only in terms of the color of the progress bar.Philippa
@geotavros I have added an image (see above).Philippa
@Steps so does everyone. If you don't touch style then Qt uses the native widget but if you use styling then it has to draw the widget itself; that's why you can't simply change a single colour.Fishbein
@Fishbein Wait a minute. Qt drawing native widgets? That's the first time I hear about it. When I was still using Ubuntu in graphical mode, Qt used to create its own stylesheet based on the gnome one that was detected in the system. Theoretically it should be possible to load that stylesheet and change just one parameter before applying it to the widget. If it's not possible to change only one instance of the progress bar, you could try subclassing it and then applying the modified style. But again, theoretically.Helot
@Helot I mean Qt gets the underlying native system to generate widgets until you start styling them, in which case Qt steps in and draws the whole thing - this is how I understand it to work.Fishbein
Ok, so what am I doing wrong about the palette?Philippa
P
16

It tried this :

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

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

as styleSheet for the progressBar and I got this enter image description here

so it is easy to change the background of the bar to the color you want and you can display a text by yourself with setFormat(). Is it working for you?

Parasitize answered 24/5, 2012 at 17:6 Comment(4)
Yes, that works for me. But as I said I find it very hard to create a look using stylesheets that is close enough to what the regular progress bars look like. That's why I was hoping for a solution using palettes. Thanks for your answer though!Philippa
where to write this codes ? or how to add it !! thanksCoriander
Make sure you don't remove the border settings or it will ignore the background-color!Hight
@McLan, the answer by Arwen tells you how to make it work: i.e. progressbar->setStyleSheet(...)Wadi
T
7

Using the "Highlight" color role does the trick in my case (using Plastique style).

QPalette p = palette();
p.setColor(QPalette::Highlight, Qt::green);
setPalette(p);
Turves answered 3/9, 2013 at 10:8 Comment(2)
also, you can do p.setColor(QPalette::Base, Qt::red); if you want to style the background of the progress bar.Lomond
This is totally ignored by the GTK style, sadly.Skimmer
A
7

I had this problem too, but I find a way, with the help of this site: http://thesmithfam.org/blog/2009/10/13/cool-qprogressbar-stylesheet/

but I just wanted to change the color and not the progressbar itself. so I got rid of the first line, and change the second one a little bit.

Finally I got what I wanted.

First do this:

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;}";

Now all you have to do is:

if(ui->progressbar->value()<80)
    ui->progressbar->setStyleSheet(danger);
else
    ui->progressbar->setStyleSheet(safe);
Assorted answered 19/12, 2013 at 6:27 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.