باستخدام PyQT، كيف يمكنك تصفية mousePressEvent لـ QComboBox مع قائمة مخصصة
سؤال
لقد حصلت على QComboBox
مع كائن قائمة مخصصة.
يحتوي كائن القائمة المخصصة على مخصص mousePressEvent
بحيث عندما ينقر المستخدم على إحدى الدوائر التي تحتوي على +/- (ملتوي)، يتم توسيع/تطوى القائمة.
عندما أستخدم القائمة مع مربع التحرير والسرد، عندما ينقر المستخدم على ملف ملتوي، يتم توسيع/طي القائمة، ولكن يتم تغيير التحديد، وتكون القائمة مخفية.كيف يمكنني تصفية هذا بحيث عندما ينقر المستخدم على ملتوي، لا يتغير التحديد، ولا يتم إخفاء القائمة.
لقطات إضافية
انهارت جميع العقد:
القائمة مخفية:
المحلول
وQT ديه eventFilter
أن QEvent.MouseButtonRelease
"يلتقط". ذلك ما فعلته تثبيت eventFilter
بلدي بتصفية أحداث QEvent.MouseButtonRelease
إذا كان المستخدم النقر على عقدة.
في بلدي كائن قائمة لدي الطريقة التالية:
def mousePressEvent (self, e):
self.colapse_expand_click = False
if <user clicked node>:
colapse_expand_node()
e.accept ()
self.colapse_expand_click = True
ووmousePressEvent
يتم تشغيلها قبل mouseReleaseEvent
.
وبعد ذلك في منسدل العرف، وتصفية الحدث:
class RevisionSelectorWidget(QtGui.QComboBox):
def __init__(self, parent = None):
QtGui.QComboBox.__init__(self, parent)
self.log_list = RevisionSelectorLogList(self)
self.setView(self.log_list)
self.log_list.installEventFilter(self)
self.log_list.viewport().installEventFilter(self)
def eventFilter(self, object, event):
if event.type() == QtCore.QEvent.MouseButtonRelease:
if self.log_list.colapse_expand_click:
return True
return False
نصائح أخرى
من أعلى رأسي، يمكنك أن تكون فئة فرعية QComboBox
وتجاوز hideEvent(QHideEvent)
(موروث من QWidget
)
def hideEvent(self, event):
if self.OkToHide():
event.accept()
else:
event.ignore()
تبدو لقطة الشاشة الخاصة بك بمثابة استخدام مثير للاهتمام لمربع التحرير والسرد، ولدي فضول لمعرفة سبب عدم استخدامك لمربع التحرير والسرد TreeView
التحكم في النمط بدلاً من القائمة؟
تحرير (14 مارس 2009):
لقد ألقيت نظرة على الكود المصدري لـ Qt ويبدو أنه عندما يتم التقاط أحداث لوحة المفاتيح والماوس، فإنه بمجرد أن تقرر qt إصدار الأمر "activated(int index)"
الإشارة، "hidePopup()"
وقد دعا.
لذا، وبصرف النظر عن إعادة كتابة رمز مرشح الأحداث، هناك خيار آخر يتمثل في توصيل "activated(int index)"
أو "highlighted(int index)"
إشارة إلى فتحة يمكن الاتصال بها "showPopup()"
والتي من شأنها إعادة رفع عناصر القائمة.إذا واجهت مشكلة طلاء/اختفاء سيئة، فقد تضطر إلى الحصول على Qt لتأخير أحداث الطلاء أثناء ظهور النافذة المنبثقة.
امل ان يساعد!