PYQT: كيف يمكنني التعامل مع qpixmaps من QTREAD؟
سؤال
يجب أن يكون هذا أكبر مصدر إزعاج واجهته مع 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()
لست متأكدًا من كيفية التعامل مع هذا النوع من الأشياء ، لأنني مجرد مبتدئ في واجهة المستخدم الرسومية ؛)
شكرا للجميع.
المحلول
بعد العديد من المحاولات ، حصلت عليها أخيرًا. لا يمكنني استخدام أ 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)
آمل أن يساعد هذا أي شخص آخر يحاول إنشاء موضوع مصغرة صورة ؛)