PYQT: Come gestisco QPixMaps da un QThread?
Domanda
Questo deve essere il più grande fastidio che abbia mai incontrato con Pyqt: ho violato un filo con la miniatura per la mia applicazione (devo amare le tonnellate di grandi immagini), e sembra che funzionerebbe (ed esso quasi fa). Il mio problema principale è questo messaggio di errore ogni volta che invio un SIGNAL
Dal mio thread:
QPixmap: It is not safe to use pixmaps outside the GUI thread
Non riesco a capire come aggirare questo. Ho provato a passare un file QIcon
attraverso il mio SIGNAL
, ma questo genera ancora lo stesso errore. Se aiuta, ecco i blocchi di codice che si occupano di queste cose:
Il Thumbnailer
classe:
class Thumbnailer(QtCore.QThread):
def __init__(self, ListWidget, parent = None):
super(Thumbnailer, self).__init__(parent)
self.stopped = False
self.completed = False
self.widget = ListWidget
def initialize(self, queue):
self.stopped = False
self.completed = False
self.queue = queue
def stop(self):
self.stopped = True
def run(self):
self.process()
self.stop()
def process(self):
for i in range(self.widget.count()):
item = self.widget.item(i)
icon = QtGui.QIcon(str(item.text()))
pixmap = icon.pixmap(72, 72)
icon = QtGui.QIcon(pixmap)
item.setIcon(icon)
La parte che chiama il thread (si verifica quando un set di immagini viene lasciato cadere nella casella di riepilogo):
self.thread.images.append(f)
item = QtGui.QListWidgetItem(f, self.ui.pageList)
item.setStatusTip(f)
self.thread.start()
Non sono sicuro di come gestire questo tipo di cose, dato che sono solo un principiante della GUI;)
Grazie a tutti.
Soluzione
Dopo molti tentativi, l'ho finalmente preso. Non posso usare un QIcon
o QPixmap
dall'interno di un thread non gui, quindi ho dovuto usare un QImage
Invece, mentre questo trasmette bene.
Ecco il codice magico:
Estratto dal thumbnailer.py
QThread
classe:
icon = QtGui.QImage(image_file)
self.emit(QtCore.SIGNAL('makeIcon(int, QImage)'), i, icon)
makeIcon()
funzione:
def makeIcon(self, index, image):
item = self.ui.pageList.item(index)
pixmap = QtGui.QPixmap(72, 72)
pixmap.convertFromImage(image) # <-- This is the magic function!
icon = QtGui.QIcon(pixmap)
item.setIcon(icon)
Spero che questo aiuti chiunque altro a cercare di creare un thread di anteprimi dell'immagine;)