Aunque una respuesta ya ha sido elegido, me gustaría expresar mi opinión.
No me gusta la respuesta seleccionada, especialmente por el uso de temporizadores. ¿Un temporizador para descargar los pixmaps? Supongamos que el usuario realmente desea echar un buen vistazo a la imagen, y después de unos segundos, bam, la imagen está descargada, tendrá que hacer algo para que la imagen vuelva a aparecer. ¿O puede ser que va a poner otro temporizador, que carga los pixmaps después de otro par de segundos? ¿O consultará entre sus miles de artículos si son visibles? Esto no solo es muy irritante e incorrecto, sino que significa que su programa utilizará recursos todo el tiempo.Supongamos que el usuario minimiza su programa y reproduce una película, se preguntará por qué demonios mi película se congela cada dos segundos ...
Bueno, si malinterpreté la idea propuesta de usar temporizadores, execuseme.
En realidad, la idea que mmutz sugirió es mejor. Me recordó el Mandelbrot example. Mira esto. En lugar de calcular qué dibujar, puede reescribir esta parte para cargar la parte de la imagen que necesita mostrar.
En conclusión voy a proponer otra solución utilizando QGraphicsView de una manera mucho más simple:
1) comprobar el tamaño de la imagen sin cargar la imagen (usar QImageReader)
2) hacer que el tamaño de su escena igual al de la imagen
3) en lugar de utilizar elementos de pixmap, vuelva a implementar la función DrawBackground(). Uno de los parámetros le dará el nuevo rectángulo expuesto, lo que significa que si el usuario se desplaza solo un poco, solo cargará y dibujará esta nueva parte (para cargar solo parte de una imagen use los métodos setClipRect() y read() de la clase QImageReader). Si hay algunas transformaciones, puede obtenerlas del otro parámetro (que es QPainter) y aplicarlas a la imagen antes de dibujarla.
En mi opinión, la mejor solución será combinar mi solución con la rosca que se muestra en el Mandelbrot example.
El único problema que se me ocurre ahora es si el usuario se aleja con un factor de gran escala. Entonces necesitará una gran cantidad de recursos por algún tiempo para cargar y escalar una imagen enorme. Bueno, ahora veo que hay alguna función de QImageReader que aún no he probado: setScaledSize(), que tal vez haga exactamente lo que necesitamos: si configuras un tamaño de escala y luego cargas la imagen, tal vez no se cargue primero toda la imagen, pruébalo Otra forma es limitar el factor de escala, algo que deberías hacer de todos modos si te apegas al método con los elementos del mapa de píxeles.
Espero que esto ayude.
Esto es genial. Ahorraría muchísimo trabajo. Me preguntaba si esto sería lento o tartamudea mientras se desplaza. Lo que había planeado originalmente era hacer un seguimiento de lo que el usuario está viendo con el mouse y el evento de la barra de desplazamiento y luego cargar los mosaicos circundantes y colocarlos en la escena con anticipación usando un hilo separado. A medida que el usuario se mueve a través de la escena, el hilo de fondo simplemente cargará y descargará los mosaicos en consecuencia. ¿La pintura de QGraphicsItem ya hace esto en el fondo? –
Si desea cargar un hilo separado, deberá enviar una señal desde su evento de pintura a un hilo de trabajo en lugar de cargar la imagen, y luego, cuando se llame a pintura, dibuje algún tipo de imagen en blanco hasta que el hilo lo haya cargado . Usted * podría * devolver un tamaño grande que el real para el 'boundingRect()' para desencadenar eventos de pintura antes de que los mosaicos sean realmente visibles. Pero esto podría tener otros efectos secundarios si no tienes cuidado. – James
Gracias, has sido de gran ayuda. Tengo la carga de baldosas casi terminada. Ahora, ¿cuál es la mejor forma de descargar los mosaicos? Por lo que entendí de su publicación anterior, sugirió que ejecutara un temporizador que destruye cada elemento de mapa de píxeles en la escena y lo establece en NULL cada pocos segundos. Y dado que se llama al método de pintura para cada actualización, restauraría automáticamente los mosaicos que se están viendo actualmente. ¿Estoy en lo cierto? –