QT - setStyleSheet zmienia wygląd dzieci

0

Witam!

Ustawiając np. kolor tytułu QGroupBox'a, zmieniają się ustawienia kolorów w nim zawartych elementów na domyślne(chyba), jeśli zmienię palete kolorów głównego okna na inne.
Zresztą zobaczcie sami:

qtwtf.png

Kod po lewej jest do okienek po prawej i na odwrót! (mała gafa w gimpie)

Jeśli zmienię kolor głównego okna poprzez: Design->MainWindow->QWidget->palette->szybko->#202020 to powstają takie kwatki...

Najgorsze jest toże cyfry w QLCDNumber są rysowane na czarno(+ obwódki białe). Jeśli taki wyświetlacz jest mały, jest nieczytelny.

Elementów będzie multum i nie jest wg. mnie profesjonalne ustawiać kolory dla każdego widget'a, niech sobie dziedziczą, ale żeby zmiana koloru/dodatnie obrazka do QGroupBox'a nie rozwała wszystkiego...

Jak to poprawić?

Qt 4.8.6

1

Najpierw napisz wyraźnie czym się różni drugi wiersz od trzeciego.
Na drugim wierszu widzę zachowanie zgodne z oczekiwaniami z kodu w pierwszym wierszu.

Poza tym, źle używasz styleSheet. Style sheet powinno się ustawiać tylko i wyłącznie na QApplication, by wygląd całej aplikacji był spójny.

0

Dla "czarnej" aplikacji:

qDebug() << ui->groupBox->palette().color(ui->groupBox->foregroundRole());
# QColor(ARGB 1, 1, 1, 1) 

Dla czarnej aplikacji z czerwonym "title":

ui->groupBox->setStyleSheet("QGroupBox::title{color: red}");
// ... //
qDebug() << ui->groupBox->palette().color(ui->groupBox->foregroundRole());
# QColor(ARGB 1, 0.133333, 0.121569, 0.117647)

Wyświetlacz dziedziczy paletę po QGroupBox'sie, a koloru do rysowania cyfr używa takiego:

fgColor    = pal.color(q->foregroundRole());

W wyniku zmiany koloru "title" na czerwony, wyświetlacz rysowany jest kolorem czarnym a nie białym i nic na nim nie widać.
Na powyższym screenie, widać tylko obwódkę na segmentach, która jest rysowana kolorami:

void QLCDNumberPrivate::drawSegment(const QPoint &pos, char segmentNo, QPainter &p, int segLen, bool erase){
// ... //
     lightColor = pal.light().color();
     darkColor  = pal.dark().color();
0

Podsumowanie:

Wystarczy dać np. QLabel oraz taki kod(np. w konstruktorze MainWindow) :

    this->setStyleSheet("QCheckBox::indicator{}");
    QPalette p = this->palette();
    p.setColor(QPalette::WindowText, Qt::red);
    this->setPalette(p);

Jeśli linijka

    this->setStyleSheet("QCheckBox::indicator{}");

występuje, to kolor tekstu na QLabel jest czarny, jeśli nie, to czerwony.

To to przecie jakiś błąd jest...

0

Robisz coś źle.
W prawym kodzie masz setStyleSheet(""); czyli napsujesz (czyścisz) inny style sheet i pewnie właśnie to ten inny style sheet jest źródłem problemu.
Jak już pisałem setStyleSheet powinno być robione tylko na QApplication, a na widgetach tylko w drodze wyjątku (do testów).

Powinieneś mieć plik CSS, który wczytujesz i ustawiasz na QApplication jak stylSheet i stosując odpowiednie reguły CSS ustawić wygląd całego UI tylko w tym pliku, bez dodatkowego dłubania przy QPalette poszczególnych widgetów.

0
MarekR22 napisał(a):

Robisz coś źle.

Skąd taka pewność?

MarekR22 napisał(a):

W prawym kodzie masz setStyleSheet(""); czyli napsujesz (czyścisz) inny style sheet i pewnie właśnie to ten inny style sheet jest źródłem problemu.

Domyślnie zawsze jest pusty, dla czytelności właśnie w takiej formie go zaprezentowałem gdyż taka linijka i tak nic nie zmienia, a przedstawia wyraźniej mój przekaz.

MarekR22 napisał(a):

Jak już pisałem setStyleSheet powinno być robione tylko na QApplication, a na widgetach tylko w drodze wyjątku (do testów).

Jak nie zauważyłeś, właśnie robię testy i nie robię tego na całej aplikacji tylko na konkretnym elemencie i dla tego wiem, że setStyleSheet psuje QPalette tylko na tym QWidgecie gdzie się go zastosowało(+dzieciarnia).

MarekR22 napisał(a):

Powinieneś mieć plik CSS, który wczytujesz i ustawiasz na QApplication jak stylSheet i stosując odpowiednie reguły CSS ustawić wygląd całego UI tylko w tym pliku, bez dodatkowego dłubania przy QPalette poszczególnych widgetów.

Spoko, ale to nie rozwiązuje mojego problemu.

Nie chcę pisać nowego super stylu, tylko podmienić ikonkę w QCheckBox.
Znalazłem informację, że faktycznie coś jest nie tak z QT, ale się nie zagłębiałem bo i tak już dużo czasu na to zmarnowałem.

MarekR22
Bardzo dziękuję, że się udzielasz i próbujesz pomóc, ale zauważyłem Twoje aroganckie (zarozumiałe?) podejście do różnych tematów na forum.
Nie będę tego rozwijał, jak podejdziesz z dystansem to też to zauważysz.
Szanuję Twoje wypowiedzi, ale nie traktuj każdego jak idioty.

0

Zupełnie nie rozumiem czemu się obrażasz!
Dajesz niepełne informacje, a ja tylko próbuje wycisnąć z ciebie więcej informacji, które są niezbędne do ustalenia problemu.
Jakbyś prawidłowo zadał pytanie (nie jest to proste zadanie i tego też trzeba się nauczyć), to nie byłoby problemów komunikacyjnych.

Na moje pytanie: "czym się różni drugi wiersz od trzeciego", opisałeś swoje obserwacje stanu końcowego, zamiast opisać jak doprowadziłeś do powstania tej różnicy. Jakbym chciał to odtworzyć u siebie, to według twojego opisu i wykonałbym zapewne inne modyfikacje niż ty (prawidłowe), przez co nie odtworzyłbym opisanego przez ciebie problemu. Jeśli przestałbym na twoich informacjach, to dostałbyś standardowa odpowiedź administratora, ale chyba nie o to chodzi!
Prawie na pewno sposób wywołania tej różnicy między tymi wierszami stwarza opisany przez ciebie problem.

Masz dwa wyjścia, albo dalej przypisywać mi złą wolę (jak na razie jestem jedynym, który próbuje ci pomóc, więc zniechęcanie mnie nie jest rozsądne), albo doznać chwili refleksji i spróbować dostarczyć informacje, które pozwolą na ustalenie problemu lub przynajmniej na naprowadzanie ciebie na źródło problemu, o którym sam wcześniej nie pomyślałeś.
Na tym forum są chyba 3 osoby, które znają ten temat, ale pozostałych dwóch nie widziałem aktywnych od paru miesięcy, więc jesteś na mnie skazany :P.

Na obecną chwilę mogę powiedzieć tylko tyle: zamiast zerować stylesheet, wykomentuj jedynie kod go zmieniający i pokaż co wtedy się dzieje. Jeśli osiągniesz inny efekt to będzie poważna wskazówka na źródło problemu.

0

Przepraszam, miałem bardzo zły dzień i do wszystkiego podchodziłem tak jak to zauważyliście.

Postaram się przedstawić problem jeszcze raz.

Zmieniam wygląd indicator'a w jednym z zaznaczalnych QGroupBox'ów.
Aby to zrobić posługuję się funkcją setStyleSheet, ponieważ tak mogę wstawić obrazek/zmienić wygląd.
screen.png

Lewy QGroupBox posiada taką modyfikację

    ui->groupBox->setStyleSheet(
        "QGroupBox::indicator{"
        " background-color: blue"
        "}"
        "QGroupBox::indicator::checked{"
        " background-color: red"
        "}"
    );

Niestety poza zmianą indicator'a zmienia także kolory całego QGroupBox'a oraz kolor tekstu na czarny.
W przypadku właśnie ciemnej aplikacji, tekst staje się nie widoczny.

Jak zmieniam kolor całej aplikacji?
A tak: Dopasuj paletę->szybko
screen1.png
Ustawiłem kolor na #505050, żeby coś jeszcze było widać.

Jeśli kolor jest ustawiony na czarny (#000000) to aplikacja wygląda tak:
screen2.png

Żeby wyglądało to normalnie, muszę dopisać do stylu:

QWidget{
  color: white;
}

I kolory są OK:
screen3.png

W załączniku dodaję także pełne kody źródłowe.
W systemie mam KDE z wyglądem przestrzeni roboczej jako "oxygen".
Aplikacja jest kompilowana w Qt 4.8.6

Problemem jest to, czemu setStyleSheet psuje paletę, nie całkiem, tylko kolory tekstu.
Nie jest to intuicyjne, gdy zmieniam konkretną rzecz, zmieniają się też inne.

0
#include "mainwindow.h"
#include <QApplication>
#include <QDebug>
#include <QStyleFactory>
#include <QStyle>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    qDebug() << QApplication::style()->metaObject()->className();
    qDebug() << QStyleFactory::keys().join(" ");
    MainWindow w;
    w.show();

    return a.exec();
}

Tak poprawione co ci pokazuje w logach?
U mnie w drugiej linii jest "Windows Fusion Macintosh" (mam Mac-a).
Następnie spróbuj uruchomić aplikację z parametrem -style=<jedna z wartości z drugiej linii>.
Całkiem możliwe, że to jest bug stylu używanym przez twojego Linux-a, ale na takie stwierdzenie trzeba mieć coś więcej (np pokazać, że na innym stylu działa poprawnie).

Na moim Mac-u żaden styl nie odtwarza twojego problemu, może spróbuje jeszcze na Linux (Ubuntu 14.04.3 LTS).

0

Wynik

Oxygen::Style 
Oxygen Windows Motif CDE Plastique GTK+ Cleanlooks

Prezentacja okienek ;)

Oxygen
01_oxygen.png

Windows
02_windows.png

Motif
03_motif.png

CDE
04_cde.png

Plastique
05_plastique.png

GTK+
06_gtk+.png

Cleanlooks
07_cleanlooks.png

Używam Debiana Jessie

0

W dokumentacji znalazłem wyjaśnienie:

Qt Doc napisał(a)

Warning: Do not use this function in conjunction with Qt Style Sheets. When using style sheets, the palette of a widget can be customized using the "color", "background-color", "selection-color", "selection-background-color" and "alternate-background-color".

Czyli jak pisałem wcześniej dostosuj wygląd aplikacji stosując jedynie styleSheet.

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