Cómo cargar un mapa de bits en una ventana en PyQt
Pregunta
Actualmente tengo una imagen PIL que me gustaría que se mostrará en una ventana PyQt. Sé que esto debe ser fácil, pero no puedo encontrar en cualquier lugar de cómo hacerlo. ¿Podría alguien darme una mano en esto? Aquí está el código de la ventana actualmente tengo:
import sys
from PyQt4 import QtGui
class Window(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('Window')
app = QtGui.QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
Edit: De acuerdo con la programación rápida Gui con Qt y Python:
De acuerdo con la documentación de PyQt, QPixmaps están optimizados para en pantalla pantalla (por lo que son rápidos para dibujar), y QImages están optimizados para la edición (Por eso los hemos usado para mantener los datos de imagen).
Tengo un algoritmo complejo que va a generar imágenes que desea mostrar en la ventana. Ellos serán creados bastante rápido, por lo que el usuario que se verá como una animación (no puede ser como 15+, 20+ de ellos por segundo). Debería entonces utilizar QPixmaps o QImages?
Solución
intentar algo como esto, puede utilizar http: // SVN .effbot.org / / stuff / recinto de seguridad pública / pil / ImageQt.py para convertir cualquier imagen a Qimage pil
import sys
from PyQt4 import QtGui
from PIL import Image
def get_pil_image(w, h):
clr = chr(0)+chr(255)+chr(0)
im = Image.fromstring("RGB", (w,h), clr*(w*h))
return im
def pil2qpixmap(pil_image):
w, h = pil_image.size
data = pil_image.tostring("raw", "BGRX")
qimage = QtGui.QImage(data, w, h, QtGui.QImage.Format_RGB32)
qpixmap = QtGui.QPixmap(w,h)
pix = QtGui.QPixmap.fromImage(qimage)
return pix
class ImageLabel(QtGui.QLabel):
def __init__(self, parent=None):
QtGui.QLabel.__init__(self, parent)
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('Window')
self.pix = pil2qpixmap(get_pil_image(50,50))
self.setPixmap(self.pix)
app = QtGui.QApplication(sys.argv)
imageLabel = ImageLabel()
imageLabel.show()
sys.exit(app.exec_())
Otros consejos
este discusión, el más rápido manera sería utilizar GLPainter con el fin de beneficiarse del rendimiento de la tarjeta gráfica.