PYQT: Wie gehe ich mit Qpixmaps aus einem QThread um?
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.
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;)