Используя 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