Chwytanie wydań klawiszy modyfikujących Qt

Jestem nowicjuszem w Qt, ale staram się zaimplementować to, co zasadniczo sprowadza się do pętli wejściowej do gry wideo w aplikacji Qt (szalone, wiem, ale sprawdź, czy możesz pomóc). Potrzebuję dokładnej, indywidualnej obsługi zdarzeń dla naciśnięć klawiszyi kluczowe wydania, dla wszystkich kluczy, w tym modyfikatorów, bez względu na to, jak dziwnie akordujesz klawiaturę.

Oczywiście, twój główny dostęp do kluczowych wydarzeń się kończyQKeyEvent. Ale powiedzmy, że dzieje się tak:

użytkownik naciska i przytrzymujeCtrlużytkownik naciska i przytrzymujeW góręwydania użytkownikaCtrl iW górę równocześnie

O ile wiem, to, co otrzymuję od Qt to:

QKeyEvent do naciśnięciaCtrl, samodzielnie (Qt::Key_Ctrl)QKeyEvent do naciśnięciaW górę, samodzielnie (Qt::Key_Up)QKeyEvent do zwolnieniaCtrl + Up, zkey() == Qt::Key_Up a bit Ctrl odzwierciedlony w zmianie modyfikatora.

Może to nie być dokładnie dokładne, ale moim najlepszym przypuszczeniem jest to, co dzieje się po zbyt dużym debugowaniu problemu. W każdym razie kluczwydanie zdarzenia, w które zaangażowane są modyfikatoryniewiarygodnie niewiarygodne.

Sekwencja Ctrl + Up na końcu jest problemem. Teraz wiem, że dostaję stan modyfikatorae->modifiers()i wciskam klawisze->key(). Mogłem zrobić kilka skomplikowanych hacków, próbując wewnętrznie zapamiętać stan modyfikatora, aby wykryć, kiedy użytkownik wydał modyfikator. Ale potem, doktorzy Qt informują mnie, mówiąc oe->modifiers(), że:

Ta funkcja nie zawsze może być zaufana. Użytkownik może go pomylić, naciskając jednocześnie oba klawisze Shift i zwalniając jeden z nich, na przykład.

Dokładnie w tym przypadku próbujęuniknąć.

Czy w Qt istnieje jakikolwiek wiarygodny sposób śledzenia naciśnięć klawiszy i wydań jeden na jeden, zarówno dla klawiszy normalnych, jak i modyfikujących? Jeśli nie, to co możesz uzyskać najbliżej?

EDYTOWAĆ: Mogę to nieco udoskonalić. Wydaje się, że jeśli się przytrzymaszCmd na komputerze Mac naciśnij kilka klawiszy (powiedzmy klawisze liter), zwolnij je, a następnie zwolnijCmd, tynie otrzymuj wydarzeń związanych z wydaniem listu. Spróbuję wyizolować mały przykład i sprawdzić, czy jest to rzeczywiście błąd Qt.

questionAnswers(2)

yourAnswerToTheQuestion