Question

Ce doit être la plus grande nuisance que j'ai rencontré avec PyQT: Je l'ai piraté ensemble un fil thumbnailing pour mon application (je dois ongle du pouce des tonnes de grandes images), et il semble que ça marcherait (et < em> presque fait). Mon principal problème est ce message d'erreur chaque fois que j'envoie un SIGNAL de mon fils:

QPixmap: It is not safe to use pixmaps outside the GUI thread

Je ne peux pas comprendre comment contourner ce problème. J'ai essayé passer un QIcon à travers mon SIGNAL, mais qui génère toujours la même erreur. Si cela peut aider, voici les blocs de code qui traitent de ce genre de choses:

La classe 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)

La partie qui appelle le fil (il se produit lorsqu'un ensemble d'images est déposé sur la zone de liste):

  self.thread.images.append(f)

  item = QtGui.QListWidgetItem(f, self.ui.pageList)
  item.setStatusTip(f)

  self.thread.start()

Je ne sais pas comment gérer ce genre de choses, comme je suis un débutant GUI;)

Merci à tous.

Était-ce utile?

La solution

Après de nombreuses tentatives, je l'ai finalement obtenu. Je ne peux pas utiliser un QIcon ou QPixmap à partir d'un fil non-GUI, j'eu à utiliser un QImage à la place, comme qui transmet très bien.

Voici le code magique:

Extrait de la classe thumbnailer.py de QThread:

  icon = QtGui.QImage(image_file)
  self.emit(QtCore.SIGNAL('makeIcon(int, QImage)'), i, icon)

Fonction 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)

Espérons que cela aide quelqu'un d'autre d'essayer de faire un fil thumbnailing d'image;)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top