2012-02-20 4 views
7

Sto utilizzando ubuntu 11.04. Questo è ciò che i miei barre di avanzamento assomigliano:Cambia il colore di una QProgressBar

progress bar

sto mostrando le barre di avanzamento in una finestra di elaborazione in batch (uno per dato lotto) e vorrebbe usarli come indicatore di stato (verde mentre tutto è andando bene, rosso in caso di errori, ...).

Ho provato diversi suggerimenti, compresi quelli fatti a this domande quasi identiche. Sfortunatamente, non ho potuto farlo funzionare e lo documentation sulla personalizzazione di QProgressBars non mi aiuta neanche io, quindi sarei molto grato per qualsiasi suggerimento su cosa sto facendo male.

Ho sottoclassi il QProgressBar come suggerito e ho provato a usare i fogli di stile e la tavolozza (non allo stesso tempo ma come alternative). Con i fogli di stile, non riesco a farlo apparire come le normali barre di avanzamento. Cambiare il colore è davvero tutto ciò che voglio fare, quindi ho pensato che sarebbe stato molto più semplice farlo usando una tavolozza invece di un foglio di stile, ma con la tavolozza non succede nulla.

Ecco una delle versioni che ho provato per la tavolozza:

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

... 

Ho provato anche la versione suggerita here, ma che non ha aiutato neanche.

+0

Documentazione sulla '' palette' e setPalette' dice: * Attenzione: Non utilizzare questa funzione in combinazione con Qt Style Sheets. * Forse questo è il problema? In quel caso potresti provare 'style' e' setStyle'. Ma è solo una mia supposizione. – Frg

+0

Qual è il tuo sistema operativo? Come appare la barra di avanzamento? – Dmitriy

+1

Se si usano i fogli di stile, è necessario impostare * tutto * non solo un singolo elemento. Mostraci il foglio di stile che hai provato. – koan

risposta

6

E 'provato questo:

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

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

come styleSheet per la Progressbar e ho ottenuto questo enter image description here

quindi è facile cambiare lo sfondo della barra per il colore che si desidera e si può visualizzare un testo da solo con setFormat(). Funziona per te?

+0

Sì, quello funziona per me. Ma come ho detto, trovo molto difficile creare un look usando fogli di stile abbastanza vicini a come appaiono le normali barre di avanzamento. Ecco perché speravo in una soluzione usando le tavolozze. Grazie per la tua risposta! – steps

+0

dove scrivere questo codice? o come aggiungerlo !! grazie anche allo –

3

L'utilizzo del ruolo del colore "Evidenzia" fa il trucco nel mio caso (utilizzando lo stile Plastique).

QPalette p = palette(); 
p.setColor(QPalette::Highlight, Qt::green); 
setPalette(p); 
+1

, si può fare 'p.setColor (QPalette :: Base, Qt :: red);' se si vuole modificare lo sfondo della barra di avanzamento. –

+0

Questo è totalmente ignorato dallo stile GTK, purtroppo. –

2

ho avuto anche questo problema, ma trovare un modo, con l'aiuto di questo sito: http://thesmithfam.org/blog/2009/10/13/cool-qprogressbar-stylesheet/

ma volevo solo per cambiare il colore e non il progressbar stesso. quindi mi sono sbarazzato della prima riga e cambio leggermente la seconda.

Finalmente ho ottenuto quello che volevo.

Prima fare questo:

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

Ora tutto ciò che dovete fare è:

if(ui->progressbar->value()<80) 
    ui->progressbar->setStyleSheet(danger); 
else 
    ui->progressbar->setStyleSheet(safe);