Mit PyQT, wie filtern Sie mouse für eine QComboBox mit benutzerdefinierter Liste
Frage
Ich habe eine QComboBox
mit einem benutzerdefinierten Liste Objekt bekommt.
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:
Liste versteckt:
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!