باستخدام PyQT، كيف يمكنك تصفية mousePressEvent لـ QComboBox مع قائمة مخصصة

StackOverflow https://stackoverflow.com/questions/603528

سؤال

لقد حصلت على QComboBox مع كائن قائمة مخصصة.

Screenshot.

يحتوي كائن القائمة المخصصة على مخصص mousePressEvent بحيث عندما ينقر المستخدم على إحدى الدوائر التي تحتوي على +/- (ملتوي)، يتم توسيع/تطوى القائمة.

عندما أستخدم القائمة مع مربع التحرير والسرد، عندما ينقر المستخدم على ملف ملتوي، يتم توسيع/طي القائمة، ولكن يتم تغيير التحديد، وتكون القائمة مخفية.كيف يمكنني تصفية هذا بحيث عندما ينقر المستخدم على ملتوي، لا يتغير التحديد، ولا يتم إخفاء القائمة.

لقطات إضافية

انهارت جميع العقد:All nodes collapsed.

القائمة مخفية:Screenshot with the list hidden.

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

المحلول

و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 لتأخير أحداث الطلاء أثناء ظهور النافذة المنبثقة.

امل ان يساعد!

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