Usando PyQt, como você filtrar mousePressEvent para uma QComboBox com lista personalizada
Pergunta
Eu tenho um QComboBox
com um objeto lista personalizada.
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:
Lista oculto:
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!