2012-02-25 14 views
9

Tengo la siguiente IU, donde se muestra el sonograma (frecuencia + representación del sonido en el tiempo). Entonces, la imagen no se carga desde algún lugar, sino que se dibuja por QPainter mientras se lee el archivo WAV.¿Cómo se puede desplazar con eficacia la imagen de 1024x90000 en una ventana?

The UI

Mi implementación actual es un objeto enorme QImage, donde se dibuja la imagen. Y en paintEvent(), dibujo parte de la gran QImage en el widget:

QPainter painter(this); 
// (int, int, QImage*, int, int) 
painter.drawImage(0, 0, *m_sonogram, 0, m_offset); 

Pero, que yo sepa, el QPixmap está optimizado para la visualización de mapas de píxeles en la pantalla, por lo que debería convertir el QImage a un QPixmap después de la el dibujo del sonograma está hecho?

Además, ¿merece la pena mantener la imagen grande como una especie de una lista enlazada de distintos QPixmap objetos de tamaño más pequeño y crea paintEvent() inteligente para operar en una lista de objetos más pequeños para evitar procedimientos de corte automática de Qt y así sucesivamente?

Cuando mi QImage es lo suficientemente grande, cada paintEvent() consume mucho CPU.

todo tipo de consejos son bienvenidos :)

+0

Quizás publique algo sobre las máquinas en las que desea que se ejecute. Usar la lista enlazada podría ser inteligente dependiendo de las máquinas de destino. – EKS

+3

Quizás estoy equivocado, pero parece que dibujas toda la imagen en cada evento de pintura. Puede pintar solo la parte de la imagen que muestra actualmente en la ventana gráfica. Eso debería mantener constante el consumo de CPU. – Masci

+0

@Masci: consulte la nota "Clipping automático" en los documentos de QPaintEvent: Qt lo hace automáticamente y no necesita copiar explícitamente ningún estado de recorte QPaintEvent en su QPainter. – timday

Respuesta

1

Sí, en mi experiencia limitada de desarrollo de aplicaciones Qt, si usted tiene una imagen estática (o una imagen con poca frecuencia actualizada) merece la pena (a efectos de rendimiento) la creación de una QPixmap y manténgalo disponible para usar a través del QPainter::drawPixmap en su controlador paintEvent.

Sin embargo, nunca he intentado hacer esto con algo más grande que imágenes de 4Kx4K, así que si funciona para su imagen enorme o se cae horriblemente cuando empiezas a estresar tu memoria de gráficos no podría decirlo. Ciertamente lo probaría antes de considerar agregar un complicado sistema de mosaico.

Cuestiones relacionadas