Usando PyQT, ¿cómo filtra mousePressEvent para un QComboBox con lista personalizada?
Pregunta
Tengo un QComboBox
con un objeto de lista personalizado.
El objeto de lista personalizada tiene un mousePressEvent
personalizado de modo que cuando el usuario haga clic en uno de los círculos con un +/- (un sinuoso), la lista se expanda / contraiga.
Cuando uso la lista con el cuadro combinado, cuando el usuario hace clic en un sinuoso, la lista se expande / contrae, pero la selección se modifica y la lista se oculta. ¿Cómo puedo filtrar esto para que cuando el usuario haga clic en un giro, la selección no cambie y la lista no se oculte?
Capturas de pantalla adicionales
Todos los nodos colapsaron:
Lista oculta:
Solución
QT tiene un eventFilter
que " captura " QEvent.MouseButtonRelease
. Entonces, lo que he hecho es instalar mi propio eventFilter
que filtra los eventos QEvent.MouseButtonRelease
si el usuario hace clic en un nodo.
En mi objeto de lista tengo el siguiente método:
def mousePressEvent (self, e):
self.colapse_expand_click = False
if <user clicked node>:
colapse_expand_node()
e.accept ()
self.colapse_expand_click = True
El mousePressEvent
se ejecuta antes de mouseReleaseEvent
.
Luego, en el cuadro combinado personalizado, filtro el 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
Otros consejos
Fuera de la parte superior de mi cabeza, puedes subclase QComboBox
y anular hideEvent (QHideEvent)
(heredado de QWidget
)
def hideEvent(self, event):
if self.OkToHide():
event.accept()
else:
event.ignore()
Su captura de pantalla parece un uso interesante de un cuadro combinado. Tengo curiosidad por saber por qué no ha usado un control de estilo TreeView
en lugar de una lista.
Editar (14 de marzo de 2009):
Miré el código fuente de Qt y parece que cuando se capturan los eventos del teclado y el mouse, que tan pronto como qt ha decidido emitir la señal " activada (índice int) "
Se ha llamado a " hidePopup () "
.
Así que, aparte de volver a escribir su código de filtro de eventos, otra opción es conectar el " activado (índice int) "
o " resaltado (índice int) "
señal a una ranura que puede llamar a " showPopup () "
que volvería a elevar los elementos de la lista. Si tiene un problema con la pintura de desaparición / aparición desagradable, es posible que tenga que obtener Qt para retrasar los eventos de pintura mientras la ventana emergente está visible.
Espero que ayude!