4

これは私が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初心者なので、この種のものをどのように処理するかわかりません;)

ありがとうございます。

4

1 に答える 1

11

試行錯誤の末、やっと手に入れました。非 GUI スレッド内からQIconorを使用することはできないため、代わりに a を使用する必要がありました。QPixmapQImage

マジックコードは次のとおりです。

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)

これが、画像のサムネイル スレッドを作成しようとしている他の人に役立つことを願っています ;)

于 2011-01-07T03:35:19.333 に答える