Pergunta

Esse deve ser o maior incômodo que encontrei com o PYQT: eu invadi um tópico de miniatura para o meu aplicativo (eu tenho que miniatura toneladas de grandes imagens), e parece que funcionaria (e isso quase faz). Meu principal problema é esta mensagem de erro sempre que envio um SIGNAL Do meu tópico:

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

Não consigo descobrir como contornar isso. Eu tentei passar um QIcon através do meu SIGNAL, mas isso ainda gera o mesmo erro. Se ajudar, aqui estão os blocos de código que lidam com essas coisas:

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

A peça que chama o encadeamento (ocorre quando um conjunto de imagens é lançado na caixa de listagem):

  self.thread.images.append(f)

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

  self.thread.start()

Não tenho certeza de como lidar com esse tipo de coisa, pois sou apenas um novato da GUI;)

Obrigado a todos.

Foi útil?

Solução

Depois de muitas tentativas, finalmente consegui. Eu não posso usar um QIcon ou QPixmap De dentro de um tópico não-gui, então tive que usar um QImage Em vez disso, como isso transmite bom.

Aqui está o código mágico:

Trecho do thumbnailer.py QThread classe:

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

makeIcon() função:

  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 isso ajude qualquer outra pessoa que tenta fazer um tópico de miniatura de imagem;)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top