Come caricare una bitmap in una finestra sul PyQt
Domanda
Al momento ho un immagine PIL che mi piacerebbe per visualizzare su una finestra PyQt. So che questo deve essere facile, ma non riesco a trovare da nessuna parte come farlo. Qualcuno potrebbe darmi una mano su questo? Ecco il codice della finestra momento ho:
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_())
Modifica: Secondo Rapid Gui programmazione con Qt e Python:
Secondo la documentazione di PyQt, QPixmaps sono ottimizzati per sullo schermo display (in modo che siano veloci a disegnare), e QImages sono ottimizzati per l'editing (Che è il motivo per cui li abbiamo utilizzati per contenere i dati dell'immagine).
Ho un complesso algoritmo che genera le immagini che voglio mostrare sulla mia finestra. Saranno creati abbastanza veloce, quindi per l'utente che avrà un aspetto proprio come un'animazione (non ci può essere come 15+, 20+ di loro al secondo). Dovrebbe quindi utilizzare QPixmaps o QImages?
Soluzione
provare qualcosa di simile, è possibile utilizzare http: // svn .effbot.org / public / stuff / sandbox / PIL / ImageQt.py di convertire qualsiasi immagine pil per QImage
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_())
Altri suggerimenti
questo discussione, il più veloce modo sarebbe quello di utilizzare GLPainter al fine di beneficiare delle prestazioni della scheda grafica.