2011-01-28 11 views
5

To dziwny problem z arkuszami stylów: Mam okno, dziecko klasy QWidget. Stosuję do niego arkusz stylów, aby idealnie zmienić tło całego okna na obraz z powtarzaniem-x i powtarzaniem-y, układając go.Arkusz stylów Qt. Kolor tła, TAK. background-image, NO

"Arkusz stylów" działa. Jeśli użyję "koloru tła" i ustawię na "czerwony", całe okno będzie pomalowane na czerwono. jednak jeśli używam obrazu tła, nie jest. jeśli dodaję WIDŻETY DZIECKOWE (używając Qt-Projektanta) w oknie, obraz tła będzie działał, tylko w tym widżecie podrzędnym, ale poza nim, w całym oknie nadrzędnym.

Oczywiście robię coś nie tak, ale nie mam pojęcia, dlaczego kolor tła będzie działał w całym oknie, ale obraz tła nie będzie, chyba że będzie widżet podrzędny, a następnie tylko wewnątrz to.

+0

Proszę opublikować arkusz stylów. Reguły stylów Qt różnią się od reguł CSS. Może to być zachowanie inne niż oczekiwane, na przykład ustawienie zakresu stylu. –

+0

Ten arkusz stylów przedstawia Jpeg TYLKO jeśli element QWidget jest już w oknie potomnym QWidget, ale tylko w obszarze tego elementu, a nie w całym oknie. QWidget { background-image: url (:/images/metal-texture.jpg); background-position: lewy górny; background-repeat: repeat-x repeat-y; /* kolor tła: czerwony; */ } – JasonGenX

+0

Niestety, nadal nie mogę powiedzieć, co się dzieje. Chciałbym wiedzieć, na jakim elemencie jest stosowany arkusz stylów. I nadal nie mam jasności co do twojej hegemonii widżetów. Czy mógłbyś napisać jakiś kod, czy może narysować schemat ASCII? Przepraszam, że jestem gęsta ...:) –

Odpowiedz

0

Poniższy kod działa poprawnie na moim komputerze. Może widzisz, gdzie to się różni od tego, co masz? Mam nadzieję, że to jest pomocne.

#include <QtGui> 

int main(int argc, char **argv) 
{ 
    QApplication app(argc, argv); 
    QWidget main_window; 
    main_window.setStyleSheet("background-image: url(Chrysanthemum.jpg); " 
          "background-position: top left; " 
          "background-repeat: repeat-xy;"); 
    main_window.show(); 
    return app.exec(); 
} 
+0

Sądzę, że jedyną różnicą jest to, że używam QT-Designer i plików * .ui, a twoje rozwiązanie jest w 100% programowane. W każdym razie myślę, że po prostu obejdę to poprzez wewnętrzny widget, który obejmuje cały obszar głównego QWidget i ma własne tło. Doceniam twoją pomoc. – JasonGenX

+0

Wygląda również na to, że stosujesz zakres 'QWidget' do swojego arkusza stylów i używając' repeat-x repeat-y' zamiast 'repeat-xy'. Może jeden z nich powoduje dziwne zachowanie? –

+0

Wybrałem ten sam przykładowy obraz systemu Windows do eksperymentowania z moim stylem! ;) –

4

Wiem, że to jest stare pytanie, ale natknąłem się na niego, ponieważ miałem dokładnie ten sam problem.

Okazuje się, że jeśli utworzysz widżet jako podklasę QFrame zamiast QWidget, właściwość obrazu tła wydaje się dobrze. Jak pokazuje przykład Dave'a, jeśli po prostu utworzysz "surowy" QWidget, to również działa dobrze. Z jakiegoś powodu, jeśli utworzysz nowy widget wyprowadzony z QWidget, obraz w tle przestanie działać.

Jeśli utworzysz widżety w Qt Designer lub Creator, nie będą one miały opcji utworzenia widgetu pochodnego QFrame, więc po prostu powiem, że chcę uzyskać klasę pochodną QWidget, a następnie ręcznie zmień .cpp i .h plik do wyprowadzenia z QFrame zamiast QWidget.

+0

Ha dzięki za to! Dziedziczenie z QFrame pomogło mi. Uratowałeś mi dzień. – Benjamin

13

Miałem podobny problem i został rozwiązany przez czytanie dokumentacji Qt Stylesheets.

Jak to powiedział w Qt arkuszy stylów odniesienia, zastosowanie stylów CSS niestandardowych widgetów odziedziczone po QWidget wymaga reimplementing paintEvent() w ten sposób:

void CustomWidget::paintEvent(QPaintEvent *) 
{ 
    QStyleOption opt; 
    opt.init(this); 
    QPainter p(this); 
    style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); 
} 

bez robienia tego niestandardowe widgety będą wspierać tylko tło , tło-klip i właściwości pochodzenia.

Możesz przeczytać o tym tutaj: Qt Stylesheets reference w sekcji "Lista stylowych widżetów" -> QWidget.

Mam nadzieję, że to pomoże!

+1

Należy zaakceptować jako rozwiązanie –