Lançamentos da tecla modificadora Catching Qt
Eu sou um recém-chegado ao Qt, mas estou tentando implementar o que basicamente equivale a um loop de entrada do tipo video-game em um aplicativo Qt (louco, eu sei, mas veja se você pode ajudar). Preciso de um tratamento de eventos preciso e individual para pressionar as teclase lançamentos de chaves, para todas as teclas, incluindo modificadores, não importa o quão estranho você acorde o teclado.
Claro, o seu principal acesso a eventos-chave é através deQKeyEvent
. Mas vamos dizer o seguinte acontece:
Tanto quanto eu posso dizer, o que eu recebo do Qt é:
QKeyEvent pela prensagem deCtrl, por si próprio (Qt::Key_Ctrl
)QKeyEvent pela prensagem deAcima, por si próprio (Qt::Key_Up
)QKeyEvent para a liberação deCtrl + Upcomkey() == Qt::Key_Up
e o bit Ctrl refletido em uma mudança de modificador.Isso pode não ser exatamente preciso, mas é o meu melhor palpite sobre o que está acontecendo com a depuração excessiva do problema. Em qualquer caso, a chavelançamento eventos quando modificadores estão envolvidos sãoincrivelmente não confiável.
A seqüência Ctrl + Up no final é o problema. Agora, eu sei que estou recebendo o estado modificador eme->modifiers()
, e eu estou recebendo a tecla de pressionamentoe->key()
. Eu poderia fazer alguns hacks complicados, tentando lembrar o estado do modificador internamente, para detectar quando o usuário liberou o modificador. Mas então, o Qt docs me informa, falando dee->modifiers()
, naquela:
Esta função nem sempre pode ser confiável. O usuário pode confundi-lo pressionando as duas teclas Shift simultaneamente e liberando uma delas, por exemplo.
Este é exatamente o caso que estou tentandoevitar.
Existe alguma maneira confiável de acompanhar os pressionamentos e liberações de teclas um para um, tanto para as teclas normais quanto para as modificadoras, no Qt? Se não, qual é o mais próximo que você consegue?
EDITAR: Eu posso refinar isso um pouco. Parece que se você segurarCmd em um Mac, pressione algumas teclas (teclas de letras, por exemplo), libere-as e solte-asCmd, tuNão receba eventos de lançamento para os lançamentos de chave de carta. Vou tentar isolar um pequeno exemplo e ver se isso é realmente um bug do Qt.