Frage

Ich habe eine QComboBox mit einem benutzerdefinierten Liste Objekt bekommt.

Screenshot.

Das benutzerdefinierte Liste Objekt hat eine eigene mousePressEvent so dass, wenn der Anwender auf einem des Kreises mit einer +/- (einem kurvigen) wird die Liste erweitert / geschlossen.

Wenn ich die Liste mit dem Kombinationsfeld verwenden, wenn der Benutzer auf einem kurvige klickt, wird die Liste erweitert / geschlossen, aber die Auswahl geändert wird, und die Liste wird ausgeblendet. Wie kann ich diese filtern, so dass, wenn der Benutzer auf einem kurvigen klicken, wird die Auswahl nicht geändert wird, und die Liste nicht verborgen.

Weitere Screenshots

Alle Knoten zusammengebrochen: Alle Knoten zusammengebrochen.

Liste versteckt: Screenshot mit der Liste ausgeblendet.

War es hilfreich?

Lösung

QT hat eine eventFilter, dass "Captures" QEvent.MouseButtonRelease. Also, was ich getan habe, ist meinen eigenen eventFilter installiert, die QEvent.MouseButtonRelease Ereignisse filtert, wenn der Benutzer auf einem Knoten klicken.

In meiner Liste Objekt Ich habe die folgende Methode:

def mousePressEvent (self, e):
    self.colapse_expand_click = False
    if <user clicked node>:
        colapse_expand_node()
        e.accept ()
        self.colapse_expand_click = True

Die mousePressEvent läuft vor mouseReleaseEvent.

Dann in der benutzerdefinierten Combobox, ich das Ereignis filtern:

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

Andere Tipps

Aus der Spitze von meinem Kopf, Sie QComboBox Unterklasse könnte, und überschreiben hideEvent(QHideEvent) (von QWidget geerbt)

def hideEvent(self, event):
  if self.OkToHide():
    event.accept()
  else:
    event.ignore()

Ihr Screenshot sieht aus wie eine interessante Verwendung einer Combo-Box, ich bin neugierig, warum Sie keine TreeView Stil Kontrolle statt einer Liste verwendet haben?

Edit (14. März 2009):

Ich schaute auf den Quellcode Qt und es aussieht, wenn die Tastatur- und Mausereignisse erfasst werden, dass sobald qt das "activated(int index)" Signal auszusenden entschieden hat, "hidePopup()" aufgerufen wurde.

So abgesehen von ihrem Ereignisfilter Code umschreiben, eine weitere Option ist es, die "activated(int index)" oder "highlighted(int index)" Signal an einen Schlitz zu verbinden, die "showPopup()" aufrufen können, die die Listenelemente wieder erhöhen würden. Wenn Sie eine böse bekommen Farbe Problem verschwinden / erscheinen müssen Sie Qt bekommen kann die Farbe Ereignisse zu verzögern, während das Popup sichtbar ist.

Ich hoffe, das hilft!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top