Frage

Dies muss das größte Ärgernis sein, das ich mit Pyqt begegnet bin: Ich habe einen Miniaturansichtenfaden für meine Anwendung zusammengehackt (ich muss Tonnen großer Bilder mit großer Ansichten), und es sieht so aus, als würde es funktionieren (und es fast tut). Mein Hauptproblem ist diese Fehlermeldung, wenn ich eine sende SIGNAL Aus meinem Thread:

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

Ich kann nicht herausfinden, wie ich das umgehen kann. Ich habe versucht, eine zu bestehen QIcon durch meine SIGNAL, Aber das erzeugt immer noch den gleichen Fehler. Wenn es hilft, sind hier die Codeblöcke, die sich mit diesem Zeug befassen:

Das Thumbnailer Klasse:

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)

Der Teil, der den Thread aufruft (er tritt auf, wenn eine Reihe von Bildern auf das Listenfeld fallen gelassen wird):

  self.thread.images.append(f)

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

  self.thread.start()

Ich bin mir nicht sicher, wie ich mit solchen Sachen umgehen soll, da ich nur ein GUI -Neuling bin;)

Dank an alle.

War es hilfreich?

Lösung

Nach vielen Versuchen habe ich es endlich bekommen. Ich kann keine verwenden QIcon oder QPixmap Aus einem Nicht-Gui-Thread musste ich a verwenden QImage Stattdessen, wie das einwandfrei übergeht.

Hier ist der magische Code:

Auszug aus dem thumbnailer.py QThread Klasse:

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

makeIcon() Funktion:

  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)

Ich hoffe, dies hilft jemandem, der versucht, einen Bild für Vorschänder zu erstellen;)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top