Используя PyQT, как вы фильтруете mousePressEvent для QComboBox с пользовательским списком - PullRequest
3 голосов
/ 02 марта 2009

У меня есть QComboBox с пользовательским списком объектов.

Screenshot.

Пользовательский объект списка имеет пользовательский mousePressEvent, поэтому, когда пользователь нажимает на один из кружков с +/- (поворот), список расширяется / сворачивается.

Когда я использую список со списком, когда пользователь нажимает на поворот, список расширяется / сворачивается, но выбор изменяется, и список скрывается. Как я могу отфильтровать это так, чтобы, когда пользователь нажимал на твист, выбор не изменялся и список не скрывался.

Дополнительные скриншоты

Все узлы развалились: All nodes collapsed.

Список скрыт: Screenshot with the list hidden.

Ответы [ 2 ]

2 голосов
/ 20 марта 2009

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
1 голос
/ 03 марта 2009

От макушки головы вы можете создать подкласс 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, чтобы отложить события рисования, пока всплывающее окно видно.

Надеюсь, это поможет!

...