سؤال

لدي qframe مع QVBOXLAYOUT وأضيف عناصر واجهة مستخدم مخصصة الخاصة بي إلى التخطيط لمحاكاة QListWidget ولكن مع مزيد من المعلومات / الوظائف في العناصر. أقوم بإضافة القطعة إلى التصميم والحفاظ على مرجع في متغير العضو (هذا هو بيثون):

 self.sv_widgets[purchase.id] = widget                
 self.vl_seatView.addWidget(widget)

ثم عندما انتهيت من عنصر، أريد إزالته من الشاشة وتنظيف المرجع:

self.vl_seatView.removeWidget(self.sv_widgets[purchase.id])
del self.sv_widgets[purchase.id]

لسوء الحظ، لا تزال القطعة قيد عرضها على الشاشة! لقد قمت بفحص وأنا أضيفها فقط إلى التصميم مرة واحدة (وبالفعل يتم عرض نسخة واحدة فقط)، حاول استدعاء التحديث يدويا () على التصميم، ولكن دون جدوى. ما هي الطريقة الصحيحة للقيام بذلك؟

هل كانت مفيدة؟

المحلول

يمكنك ان تفعلها:

import sip # you'll need this import (no worries, it ships with your pyqt install)
sip.delete(self.sv_widgets[purchase.id])

sip.delete(obj) صراحة يستدعي Destructor على كائن C ++ المقابل. removeWidget لا يسبب هذا المدمر يسمى (لا يزال لديه الوالد في تلك المرحلة) و del علامات فقط بيثون كائن لجمع القمامة.

يمكنك تحقيق نفس الشيء من خلال القيام (نظافة نقع):

self.vl_seatView.removeWidget(self.sv_widgets[purchase.id])
self.sv_widgets[purchase.id].setParent(None)
del self.sv_widgets[purchase.id]

نصائح أخرى

يمكنك أيضا استخدام Self.Sv_widgets [شراء.id] .deletelater ()

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top