Gradient, QProgressBar

0

Cześć.
Środowisko Qt. Kodu nie będę wstawiał, bo nie ma sensu. Pytanie czysto teoretyczne...

Czy jest możliwość albo ktoś spotkał się z potrzebą wstawienia gradientu do obiektu QProgressBar?
Piszę sobie w wolnym czasie grę 2D, w której chciałbym aby pasek hp był reprezentowany przez QProgressBar. Na polski, pasek postępu. Standardowo, wartość "postępu" jest zielona i jest to powiązane chyba z Windowsem jako systemem operacyjnym ( właśnie tutaj pojawia się moja wątpliwość, czy jest to atrybut który da się zmienić). Chciałbym dodać gradient, który waha się od czerwonego do zielonego, zależnie od pozostałych punktów życia/hp.
Bawiłem się z StyleSheets obiektu oraz kombinowałem z QPalette, ale nie mogłem tam znaleźć atrybutu odpowiedzialnego za kolor paska.
Ktoś cokolwiek miał może z czymś takim do czynienia? Albo pomysł, czego użyć, żeby zrobić taki pasek ( od biedy mógłby być nawet zwykły prostokąt w prostokącie w którym dałbym gradient jako wypełnienie i metodę sterującą wypelnieniem, ale do tego musiałbym robić oddzielną klasę, a wolał bym tego uniknąć).

Pozdro.

1

nie jestem pewien ale chyba powinno zadziałać

QProgressBar * progressBar = yourporogresbar;
QColor c(Qt::red);
QPalette * pal = progressBar->palette();

pal.setColor(QPalette::Active, QColorGroup::Highlight, c);
// or
pal.setColor(QPalette::Inactive, QColorGroup::Highlight, c);
// or
pal.setColor(QPalette::Disabled, QColorGroup::Highlight, c);

progressBar->setPalette(pal); 
3

Trzeba dodać taki styl:

QProgressBar::chunk {
    /* trytytyty */
    background-color: red;
}

Tu jest opisane wszystko http://doc.qt.io/qt-4.8/stylesheet-examples.html

PS. Do wystylizowania gradientu trzeba użyć atrybutu qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0, stop: 0 red, stop 0.4 red, stop 0.5 black, stop 1 black)

0

Tylko, że teraz wygląda to oczywiście tak, że gradient jest wstawiany do "chunk" i przeskalowywany-> wszystkie kolory są widoczne od razu, a ja chciałbym żeby gradient był na całą szerokość ProgressBar i był "odsłaniany" po trochu, zależnie od stanu gracza. Na pewno potrafisz sobie wyobrazić;).
Nie miałem czasu dokładnie przyjrzeć się, ale z tego co znalazłem na internecie na szybko, prawdopodobnie będę musiał zrobić metodę zwracającą QString zawierający w sobie opis stylu, i aktualizowanie StyleSheet ProgressBara przy każdej zmianie o ten QString.
Tak czy siak, dzięki za wszystkie podpowiedzi. Na pewno dobry kierunek i nim będę podążał. Wstawię kod, jeśli uda mi się to poprawnie rozgryźć bez cudów na kiju.

bajos napisał(a):

Trzeba dodać taki styl:

QProgressBar::chunk {
    /* trytytyty */
    background-color: red;
}

Tu jest opisane wszystko http://doc.qt.io/qt-4.8/stylesheet-examples.html

PS. Do wystylizowania gradientu trzeba użyć atrybutu qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0, stop: 0 red, stop 0.4 red, stop 0.5 black, stop 1 black)

0

Znaczy progressbar jest podzielony na te chunki z tego co zrozumiełem. Ja bym spróbował zrobić to tak że ustawił bym ten styl na qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0, stop: 0 red, stop 0.9 red stop 1 black), usunąć wszystkie dekoracje ze stylu jeśli są i ustawić, żeby chunk przyjmował maksymalną szerokość PB. Później to normalnie aktualizować postęp PB przez setValue(val).

PS. Jak możesz dodaj screen jak teraz to wygląda.

0

Postanowiłem jednak wrzucić prostą zmianę koloru przy procentowej zmianie hp. Później jeszcze sobie dogram kolory i ilość zmian, ale nie zrezygnowałem z gradientu, bo nie było to do zrobienia.;)
Wstawiam kod, ale nie ma tutaj nic szczególnego. Same gettery i sprawdzenie wartości value QProgressBar.

 
void HpBar::Color(){

    if (getBarValue()>75){
        this->setStyleSheet("QProgressBar::chunk {background-color: green}");
    }
    else if(getBarValue()>50 && getBarValue()<=75){
        this->setStyleSheet("QProgressBar::chunk {background-color: yellow}");
    }
    else if (getBarValue()>25 && getBarValue() <=50){
        this->setStyleSheet("QProgressBar::chunk {background-color: orange}");
    }
    else {
        this->setStyleSheet("QProgressBar::chunk {background-color: red}");
    }
}

Ps. Jedno pytanie: napisałeś, żeby ustawić sobie wartość chunk na całą szerokość QProgressBara i później, żeby modyfikować postęp "pokazanego" gradientu wartością value. A nie jest tak, że chunk jest sprzężony z wartością value?
Chodzi mi o to, że na moje myślenie:
ustawiam chunk na całą szerokość PB ( czyli de facto, value ustawione jest na 100)
za pomocą setValue zmieniam wartość "value" ( tylko, że od razu cały gradientowy pasek zostaje przeskalowany)
I chyba jest się w punkcie wyjścia.
Jedyna rzecz jaka przychodzi mi do głowy:

  1. to porzucenie QProgressBara
  2. zrobienie normalnego prostokąta który przechowuje w sobie gradient i jego część jest przezroczysta ( tutaj znowu nie wiadomo, czy się tak da)
  3. na chama: zrobienie pkt 2, i nad nim ustawienie drugiego prostokąta z kolorem tła-> w trakcie zmiany wartości hp, będzie zmniejszany/zwiększany i tym samym, będzie co raz odsłaniał/zakrywał właściwy pasek z gradientem.

3 najłatwiejsze chyba do zrobienia, ale absolutnie nie podobało by mi się coś takiego. Ale jak mówiłem, zostawiam to na rzecz prostej zmiany koloru całego paska.
Pozdro.

PPS: Tutaj ten sam problem i postawiono na zmianę koloru całego paska, zależnie od procentowej wartości.
https://forum.qt.io/topic/53447/solved-changing-progress-indicator-in-qprogressbar/9

1 użytkowników online, w tym zalogowanych: 0, gości: 1