Usando PyQT, come filtrate mousePressEvent per un QComboBox con un elenco personalizzato
Domanda
Ho un QComboBox
con un oggetto elenco personalizzato.
L'oggetto elenco personalizzato ha un mousePressEvent
personalizzato in modo che quando l'utente fa clic su uno dei cerchi con un +/- (un twisty), l'elenco viene espanso / compresso.
Quando uso l'elenco con la casella combinata, quando l'utente fa clic su un twisty, l'elenco viene espanso / compresso, ma la selezione viene modificata e l'elenco viene nascosto. Come posso filtrarlo in modo tale che quando l'utente fa clic su un twisty, la selezione non viene modificata e l'elenco non è nascosto.
Ulteriori screenshot
Tutti i nodi sono crollati:
Elenco nascosto:
Soluzione
QT ha un eventFilter
che " cattura " QEvent.MouseButtonRelease
. Quindi quello che ho fatto è stato installato il mio eventFilter
che filtra gli eventi QEvent.MouseButtonRelease
se l'utente fa clic su un nodo.
Nel mio oggetto elenco ho il seguente metodo:
def mousePressEvent (self, e):
self.colapse_expand_click = False
if <user clicked node>:
colapse_expand_node()
e.accept ()
self.colapse_expand_click = True
mousePressEvent
viene eseguito prima di mouseReleaseEvent
.
Quindi nella casella combinata personalizzata, filtro l'evento:
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
Altri suggerimenti
In cima alla mia testa, potresti sottoclassare QComboBox
e sovrascrivere hideEvent (QHideEvent)
(ereditato da QWidget
)
def hideEvent(self, event):
if self.OkToHide():
event.accept()
else:
event.ignore()
Il tuo screenshot sembra un uso interessante di una casella combinata, sono curioso di sapere perché non hai usato un controllo di stile TreeView
invece di un elenco?
Modifica (14 marzo 2009):
Ho guardato il codice sorgente Qt e sembra che quando vengono catturati gli eventi della tastiera e del mouse, che non appena qt ha deciso di emettere il segnale " attivato (int index) "
, " hidePopup () "
è stato chiamato.
Quindi oltre a riscrivere il loro codice filtro eventi, un'altra opzione è connettere " attivato (int index) "
o " evidenziato (int index) "
segnala a uno slot che può chiamare " showPopup () "
che rievoca nuovamente le voci dell'elenco. Se si verifica un brutto problema di scomparsa / visualizzazione della vernice, potrebbe essere necessario ottenere Qt per ritardare gli eventi della pittura mentre il popup è visibile.
Spero che ti aiuti!