Domanda

Ho un QComboBox con un oggetto elenco personalizzato.

Screenshot.

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: Tutti i nodi sono crollati.

Elenco nascosto: Schermata con l

È stato utile?

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!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top