2009-10-20 3 views
17

Czy właściwości dynamiczne Qt są tak dynamiczne dzięki arkuszom stylów?Czy arkusze stylów Qt naprawdę obsługują _dynamiczne_ właściwości?

Mam podstawowy przykład z arkuszy stylów i właściwości dynamicznych:

/*stylesheet:*/ 
*[field_mandatory="true"] { background-color: "yellow";} 

I mam ten happening w czasie wykonywania gdzieś w kodzie:

/*code:*/ 
myWidget->setProperty("field_mandatory", field->isFilled()); 

nic się nie zmieni w UI, gdy ta właściwość jest zmieniono w czasie wykonywania.

Czy ktoś ma pomysły, co należy zrobić, aby zaktualizować silnik arkusza stylów Qt przy zmianie właściwości lub czy jest on nawet zdolny do obsługi tego rodzaju przypadków?

Przy okazji. Używam Qt 4.4

+0

Może trzeba ją mieć Q_PROPERTY? – cheez

Odpowiedz

6

Znalazłem szybki, choć nieco hackowaty sposób aktualizowania stylu widgetu.

myWidget->style()->unpolish(myWidget); 
myWidget->ensurePolished(); 

Wykonanie tej operacji po zmianie właściwości utrzymuje korelację między danymi właściwości a interfejsem użytkownika.

+0

To nie działało dla mnie z PyQt 4.7.2 (Qt 4.6.2) Jednak sugestia Ton van den Heuvel. –

+0

To działa dla mnie! Używam Qt 4.7 i zmiany właściwości "enabled" przez 'QWidget :: setEnabled (bool)' nie zmieniały wyglądu widżetu poprzez odpowiednie '[enabled =" false "]' i '[enabled = "true"] 'sekcje w arkuszu stylów. Korzystanie z powyższego działało jak urok. Właśnie zapakowałem je w funkcję 'rePolish (QWidget *)' i zasypałem wywołania tej funkcji w całym moim kodzie, niezależnie od tego, gdzie zmienia się włączony stan. – kurige

+1

Na marginesie: Ktokolwiek zignorował powyższą odpowiedź ... "To nie działa dla mnie" generalnie nie jest wystarczającym powodem, aby zgodzić się na to. – kurige

2

Próbowałem tego również bez powodzenia, a kiedy znalazłem poniższy tekst w dokumentacji, poddałem się. Zobacz The Style Sheet Syntax:

Uwaga: Jeżeli wartość Qt zmian własności po arkuszu stylów został ustawiony, może być konieczne życie Przeliczenie arkusza stylów. Jednym ze sposobów osiągnięcia tego jest zdjęcie arkusza stylów i ustawienie go ponownie.

3

Poniższe działa na mnie w celu zapewnienia właściwego restyling widgetu:

myWidget->setStyle(QApplication::style())

Zmuszanie Przeliczenie z arkuszy stylów, jak proponowane przez MDCL nie działa dla mnie. Używam Qt 4.5.3.

+0

To zadziałało dla mnie przy użyciu PyQt 4.7.2 (P 4.6.2). Prawdziwy wstyd, że te rzeczy nie działają tak ładnie. Powinieneś być w stanie zadzwonić do funkcji securePolished() i zrobić to. –

18

Qt ma następującą rekomendację w ich FAQ:

style()->unpolish(theWidget); 
style()->polish(theWidget); 

Mówią także można przywrócić arkusz stylów w następujący sposób, ale jest droższe:

setStyleSheet(styleSheet());