2009-12-10 12 views
5

Tengo alrededor de 40 botones que también son indicadores (Encendido o Apagado) y una vez por segundo actualizo el color de estos indicadores dependiendo del estado. Lo hago cambiando la hoja de estilos. ¿Se trata de matar demasiado para hacer esto y, de ser así, solo debo establecer una nueva hoja de estilo cuando el indicador ha cambiado de estado o debería usar algo como QBrush?El uso de styleSheets de forma dinámica agrega mucho cálculo

+2

¿No respondería a su pregunta si utilizó el monitor de rendimiento de O/S ('perfmon.exe' en Windows) para medir la cantidad de cómputo de la CPU? – ChrisW

Respuesta

1

Sí. Descubrí que con Qt 4.6.2 en Linux, configurar una hoja de estilo para cambiar el color del texto en QLabel es muy lento.

La hoja de estilos dinámica parecía una gran solución, pero para mí, la necesaria setStyle() era tan cara como setStyleSheet()!

Después de mucha experimentación, he encontrado esta alternativa a tener por lo menos dos veces más rápido, y por lo general más de 50 veces más rápidas:

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

Dependiendo de cómo su hoja de estilo (estática) está configurado, usted' d tiene que reemplazar QPalette::WindowText con QPalette::Window o QPalette::Button. Vea el QPalette documentation para más detalles.

+0

es un concepto genial. Desafortunado de que lo mencionen explícitamente es para "propósitos de demostración solamente" y "no debe usarse para producción" (aunque sí lo usé :) –

+0

bump. sin faltarle el respeto a la respuesta anterior :) –

+0

@yanbellavance, ¿tiene un enlace donde mencionan que es 'solo para fines de demostración' y 'no se debe usar en producción? –

10

No establezca dinámicamente hojas de estilo completas. En su lugar, defina una hoja de estilo de toda la aplicación usando una hoja de estilo dinámica que analiza una vez al inicio de la aplicación. Luego, en la hoja de estilo, definir las propiedades dinámicas de hojas de estilo que se detallan en el documentation:

Hay muchas situaciones en las que necesitamos para presentar un formulario que tiene campos obligatorios. Para indicar al usuario que el campo es obligatorio, una solución efectiva (aunque estéticamente dudosa) es utilizar amarillo como color de fondo para esos campos. Resulta que esto es muy fácil de implementar usando Qt Style Sheets. En primer lugar, nos gustaría usar el siguiente sea aplicable en toda la hoja de estilo:

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

En su caso, probablemente podría hacer algo como esto:

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

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

A continuación, actualice la propiedad botón de 'estado':

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

Desafortunadamente, para Qt 4.6 tendrá que forzar un recálculo de la hoja de estilo restableciendo el estilo del accesorio, de ahí el setStyle() llamada.

El uso de hojas de estilo dinámicas de esta manera es muy rápido. Estoy trabajando en una aplicación que hace un uso intensivo de las propiedades dinámicas de la hoja de estilos y no ha notado ninguna degradación del rendimiento.

+0

Gracias por la gran respuesta. Entonces desde Qt 4.6 tendré que llamar a pushButton-> setStyle (QApplication :: style()); cada vez que cambio las propiedades para afectar el estilo? Lo pondré en mi código ahora mismo para evitar problemas futuros. –

+0

¿estás absolutamente seguro de que este será el caso en Qt 4.6? –

+0

No he logrado que el comportamiento dinámico funcione sin restablecer el estilo. También vea esta pregunta: http: // stackoverflow.com/questions/1595476/are-qts-stylesheets-really-handling-dynamic-properties/1849127 # 1849127 ¿Logró obtener el comportamiento dinámico sin restablecer el estilo del widget? Estoy usando Qt en Linux, no estoy seguro de si eso hace alguna diferencia. –

1

En mi experiencia, las hojas de estilo consumen demasiados recursos, es mejor evitarlos si puede.

+3

¿Qué es demasiado? –

+0

la frecuencia de actualización fue una vez por segundo y la PC cuádruple en la que se ejecuta mi aplicación fue tan sencilla que se ejecutó al 0% :) –

Cuestiones relacionadas