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