Usando PyQt, como você filtrar mousePressEvent para uma QComboBox com lista personalizada

StackOverflow https://stackoverflow.com/questions/603528

Pergunta

Eu tenho um QComboBox com um objeto lista personalizada.

Captura de tela.

O objeto lista personalizada tem uma mousePressEvent personalizado para que quando o usuário clicar em um dos círculos com um +/- (a torcida), a lista é expandida / entrou em colapso.

Quando eu uso a lista com a caixa de combinação, quando o usuário clica em um caminho sinuoso, a lista é expandida / entrou em colapso, mas a seleção é alterada, ea lista está escondido. Como posso filtrar isso para que quando o usuário clique em um sinuoso, a seleção não é alterada, ea lista não oculta.

screenshots adicionais

Todos os nós entrou em colapso: Todos nós entrou em colapso.

Lista oculto: Captura de tela com a lista escondido.

Foi útil?

Solução

QT tem uma eventFilter que "captura" QEvent.MouseButtonRelease. Então, o que eu tenho feito é instalado minha própria eventFilter que os filtros QEvent.MouseButtonRelease eventos se o usuário clique em um nó.

Na minha lista de objetos Eu tenho o seguinte 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

Os mousePressEvent corridas antes mouseReleaseEvent.

Em seguida, na caixa de combinação personalizada, eu filtrar o 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

Outras dicas

Em cima da minha cabeça, você poderia subclasse QComboBox e hideEvent(QHideEvent) override (herdado de QWidget)

def hideEvent(self, event):
  if self.OkToHide():
    event.accept()
  else:
    event.ignore()

Seus olhares imagem de tela como uma aplicação interessante de uma caixa de combinação, estou curioso para saber por que você não tenha usado um controle de estilo TreeView vez de uma lista?

Editar (14 de marco de 2009):

Eu olhei para o código-fonte Qt e parece que quando os eventos de teclado e mouse são capturados, que assim que qt decidiu emitir o sinal "activated(int index)", "hidePopup()" foi chamado.

Assim, para além de reescrever seu código filtro de eventos, outra opção é conectar o "activated(int index)" ou sinal "highlighted(int index)" para um slot que pode chamar "showPopup()" que re-raise os itens da lista. Se você receber uma desagradável desaparecer / aparecer questão tinta que você pode ter que começar Qt para atrasar os eventos de pintura enquanto o pop-up é visível.

Espero que ajude!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top