Avec PyQT, comment filtrez-vous mousePressEvent pour un QComboBox avec une liste personnalisée
Question
J'ai un QComboBox
avec un objet de liste personnalisé.
L'objet de liste personnalisé a un mousePressEvent
personnalisé. Ainsi, lorsque l'utilisateur clique sur l'un des cercles avec un +/- (un tordu), la liste est développée / réduite.
Lorsque j'utilise la liste avec la liste déroulante, lorsque l'utilisateur clique sur un twisty, la liste est développée / réduite, mais la sélection est modifiée et la liste est masquée. Comment puis-je filtrer cela afin que lorsque l'utilisateur clique sur un bouton, la sélection ne soit pas modifiée et la liste n'est pas masquée.
Captures d'écran supplémentaires
Tous les nœuds se sont effondrés:
Liste cachée:
La solution
QT a un eventFilter
qui "capture". QEvent.MouseButtonRelease
. J'ai donc installé mon propre eventFilter
qui filtre les événements QEvent.MouseButtonRelease
si l'utilisateur clique sur un nœud.
Dans ma liste d'objet, j'ai la méthode suivante:
def mousePressEvent (self, e):
self.colapse_expand_click = False
if <user clicked node>:
colapse_expand_node()
e.accept ()
self.colapse_expand_click = True
mousePressEvent
est exécuté avant mouseReleaseEvent
.
Puis, dans la liste déroulante personnalisée, je filtre l'événement:
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
Autres conseils
De mémoire, vous pouvez sous-classer QComboBox
et remplacer le hideEvent (QHideEvent)
(hérité de QWidget
)
def hideEvent(self, event):
if self.OkToHide():
event.accept()
else:
event.ignore()
Votre capture d'écran ressemble à une utilisation intéressante d'une liste déroulante. Je suis curieux de savoir pourquoi vous n'avez pas utilisé de contrôle de style TreeView
au lieu d'une liste?
Modifier (14 mars 2009):
J'ai consulté le code source Qt et, lorsque les événements du clavier et de la souris sont capturés, il semble que dès que qt a décidé d'émettre le signal "quotient" (index int) et "
" , "hidePopup ()"
a été appelé.
Ainsi, en plus de réécrire leur code de filtre d'événements, une autre option consiste à connecter le "activé (index int))"
ou "en surbrillance (int index)"
signalez à un emplacement pouvant appeler "showPopup ()"
, ce qui permettrait de réélever les éléments de la liste. Si vous rencontrez un vilain problème de peinture disparaître / apparaître, vous devrez peut-être demander à Qt de retarder les événements de peinture tant que la fenêtre contextuelle est visible.
J'espère que ça aide!