PyQt: Как мне обрабатывать QPixmaps из QThread? - PullRequest
3 голосов
/ 06 января 2011

Это должно быть самой большой неприятностью, с которой я столкнулся в PyQT: я собрал ветку миниатюр для своего приложения (мне нужно сделать миниатюру больших изображений), и похоже, что это будет работать 1001 * почти делает). Моя главная проблема - это сообщение об ошибке всякий раз, когда я отправляю 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;)

Спасибо всем.

1 Ответ

9 голосов
/ 07 января 2011

После многих попыток я наконец получил это.Я не могу использовать 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)

Надеюсь, что это поможет кому-то еще, пытаясь создать тему для миниатюр изображений;)

...