PYQT: ¿Cómo manejo QPIXMAPS desde un QTHREAD?
Pregunta
Esta tiene que ser la mayor molestia que he encontrado con Pyqt: he pirateado un hilo de miniatura para mi aplicación (tengo que miniatura de toneladas de imágenes grandes), y parece que funcionaría (y eso casi lo hace). Mi principal problema es este mensaje de error cada vez que envío un SIGNAL
De mi hilo:
QPixmap: It is not safe to use pixmaps outside the GUI thread
No puedo entender cómo evitar esto. He intentado pasar un QIcon
A través de mi SIGNAL
, pero eso todavía genera el mismo error. Si ayuda, aquí están los bloques de código que tratan con estas cosas:
los Thumbnailer
clase:
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 que llama al hilo (ocurre cuando se deja caer un conjunto de imágenes en el cuadro de lista):
self.thread.images.append(f)
item = QtGui.QListWidgetItem(f, self.ui.pageList)
item.setStatusTip(f)
self.thread.start()
No estoy seguro de cómo manejar este tipo de cosas, ya que solo soy un novato de la GUI;)
Gracias a todos.
Solución
Después de muchos intentos, finalmente lo obtuve. No puedo usar un QIcon
o QPixmap
desde dentro de un hilo no gui, así que tuve que usar un QImage
En cambio, como eso transmite bien.
Aquí está el código mágico:
Extracto del thumbnailer.py
QThread
clase:
icon = QtGui.QImage(image_file)
self.emit(QtCore.SIGNAL('makeIcon(int, QImage)'), i, icon)
makeIcon()
función:
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)
Espero que esto ayude a cualquier otra persona que intente hacer un hilo de miniatura de imagen;)