Avec PyQT, comment filtrez-vous mousePressEvent pour un QComboBox avec une liste personnalisée

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

Question

J'ai un QComboBox avec un objet de liste personnalisé.

Capture d

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: Tous les nœuds se sont effondrés.

Liste cachée: Capture d

Était-ce utile?

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!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top