PYQT:QTHREADからQPIXMAPを処理するにはどうすればよいですか?
質問
これは私がPYQTで遭遇した最大の迷惑でなければなりません:私は私のアプリケーションのためにサムネーリングスレッドを一緒にハッキングしました(私は大量の大きな画像をサムネイルする必要があります)、そしてそれは機能するように見えます(そしてそれはそれです ほとんど します)。私の主な問題は、私が送信するたびにこのエラーメッセージです SIGNAL
私のスレッドから:
QPixmap: It is not safe to use pixmaps outside the GUI thread
これを回避する方法がわかりません。渡してみました QIcon
私を通して SIGNAL
, 、しかし、それでも同じエラーが生成されます。それが役立つ場合、こちらを扱うコードブロックがあります。
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)
スレッドを呼び出す部分(それは、一連の画像がリストボックスにドロップされたときに発生します):
self.thread.images.append(f)
item = QtGui.QListWidgetItem(f, self.ui.pageList)
item.setStatusTip(f)
self.thread.start()
私はただのGUI初心者だからです。)
ありがとうございます。
解決
何度も試みた後、私はついにそれを手に入れました。使用できません QIcon
また QPixmap
非GUIスレッド内から、私は QImage
代わりに、それがうまく伝わるので。
これが魔法のコードです:
からの抜粋 thumbnailer.py
QThread
クラス:
icon = QtGui.QImage(image_file)
self.emit(QtCore.SIGNAL('makeIcon(int, QImage)'), i, icon)
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)
これが、画像のサムネーリングスレッドを作成しようとする他の人に役立つことを願っています;)
所属していません StackOverflow