PYQT: Как я могу обрабатывать qpixmaps из qtread?
Вопрос
Это должно быть самым большим неприятностью, которое я встречал с PYQT: я взломал эскизную нить для моего приложения (я должен миниатюру тонны больших изображений), и похоже, что это будет работать (и это почти делает). Моя главная проблема - это сообщение об ошибке всякий раз, когда я отправляю SIGNAL
Из моей темы:
QPixmap: It is not safe to use pixmaps outside the GUI thread
Я не могу выяснить, как обойти это. Я пытался пройти QIcon
через мой SIGNAL
, но это все еще генерирует ту же ошибку. Если это поможет, вот кодовые блоки, которые имеют дело с этим материалом:
То Thumbnailer
сорт:
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)
Часть, которая вызывает поток (это происходит, когда набор изображений упал на коробку списка):
self.thread.images.append(f)
item = QtGui.QListWidgetItem(f, self.ui.pageList)
item.setStatusTip(f)
self.thread.start()
Я не уверен, как справиться с такими вещами, как я просто нюбинги Gui;)
Спасибо всем.
Решение
После многих попыток я наконец получил это. Я не могу использовать QIcon
или QPixmap
из нити не градусов, поэтому я должен был использовать QImage
вместо этого, как это передает нормально.
Вот волшебный код:
Выдержка из thumbnailer.py
QThread
сорт:
icon = QtGui.QImage(image_file)
self.emit(QtCore.SIGNAL('makeIcon(int, QImage)'), i, icon)
makeIcon()
Функция:
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)
Надеюсь, что это поможет кому-то еще пытающимся сделать эскиз изображения;)