Pregunta

Tengo un QComboBox con un objeto de lista personalizado.

Captura de pantalla.

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: Todos los nodos colapsados.

Lista oculta: Captura de pantalla con la lista oculta.

¿Fue útil?

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!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top