2009-12-10 3 views
5

Ho circa 40 pulsanti che sono anche indicatori (On o Off) e una volta al secondo aggiorno il colore di questi indicatori a seconda dello stato. Lo faccio cambiando il foglio di stile. E 'finita kill per fare questo e in caso affermativo dovrei solo impostare un nuovo foglio di stile quando l'indicatore ha cambiato stato o dovrei usare qualcosa come QBrush?L'uso di styleSheets in modo dinamico aggiunge molto computo

+2

Non risponderebbe alla tua domanda se hai usato il monitor delle prestazioni O/S ('perfmon.exe' su Windows) per misurare la quantità di calcolo della CPU? – ChrisW

risposta

1

Sì. Ho trovato che con Qt 4.6.2 su Linux, l'impostazione di un foglio di stile per cambiare il colore del testo su una QLabel è molto lento.

Il foglio di stile dinamico sembrava un'ottima soluzione, ma per me, lo setStyle() necessario era altrettanto costoso di setStyleSheet()!

Dopo molta sperimentazione, ho trovato almeno due volte più veloce, e di solito più di 50 volte più rapidi questa alternativa di essere:

QPalette palette = lbl->palette(); 
palette.setColor(QPalette::WindowText, Qt::gray); 
lbl->setPalette(palette); 

A seconda di come il vostro foglio di stile (statica) è impostato, è' d necessario sostituire QPalette::WindowText con QPalette::Window o QPalette::Button. Vedere lo QPalette documentation per i dettagli.

+0

è un concetto interessante. Sfortunatamente, loro menzionano esplicitamente che è solo per "scopi dimostrativi" e che "non dovrebbe essere usato per la produzione" (anche se l'ho usato :) –

+0

bump. non mancare di rispetto alla risposta precedente :) –

+0

@yanbellavance, hai un link in cui menzionano che è 'solo a scopo dimostrativo' e 'non dovrebbe essere usato in produzione? –

10

Non impostare in modo dinamico fogli di stile completi. Invece, definire un foglio di stile ampio dell'applicazione utilizzando il foglio di stile dinamico che si analizza una volta all'avvio dell'applicazione. Poi, nel foglio di stile, definire le proprietà del foglio di stile dinamiche, come specificato nel documentation:

Ci sono molte situazioni in cui dobbiamo presentare un modulo contenente campi obbligatori. Per indicare all'utente che il campo è obbligatorio, una soluzione efficace (anche se esteticamente discutibile) è quella di usare il giallo come colore di sfondo per quei campi. Risulta che questo è molto facile da implementare utilizzando fogli stile Qt. In primo luogo, vorremmo utilizzare il seguente foglio di stile a livello di applicazione:

*[mandatoryField="true"] { background-color: yellow } 

Nel tuo caso, probabilmente si potrebbe fare qualcosa di simile:

QPushButton[state="on"] { 
    background-color: green; 
} 

QPushButton[state="off"] { 
    background-color: red; 
} 

quindi aggiornare il pulsante 'Stato' immobile:

pushButton->setProperty("state", "on"); 
pushButton->setStyle(QApplication::style()); 

Purtroppo, per Qt 4.6 è necessario forzare un ricalcolo del foglio di stile resettando lo stile del widget, da cui ilChiamata.

L'utilizzo di fogli di stile dinamici in questo modo è molto veloce. Sto lavorando su un'applicazione che fa un uso pesante delle proprietà del foglio di stile dinamico e non ho notato alcuna degredation delle prestazioni.

+0

Grazie per l'ottima risposta. Quindi da Qt 4.6 dovrò chiamare pushButton-> setStyle (QApplication :: style()); ogni volta che cambio le proprietà per influenzare lo stile? Lo inserirò nel mio codice adesso per evitare problemi futuri. –

+0

sei assolutamente sicuro che questo sarà il caso in Qt 4.6? –

+0

Non sono riuscito a far funzionare il comportamento dinamico senza reimpostare lo stile. Vedi anche questa domanda: http: // StackOverflow.it/questions/1595476/are-qts-stylesheets-really-handling-dynamic-properties/1849127 # 1849127 Sei riuscito a ottenere il comportamento dinamico senza reimpostare lo stile del widget? Sto usando Qt sotto Linux, non sono sicuro che ciò faccia differenza. –

1

Nella mia esperienza, i fogli di stile consumano troppe risorse, meglio evitarli se possibile.

+3

Cosa c'è di troppo? La frequenza di aggiornamento –

+0

era una volta al secondo e il PC quad core su cui è in esecuzione la mia app era così fluido che funzionava allo 0% :) –

Problemi correlati