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.

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top