W Qt QKeyEvent
mogę sprawdzić czy Ctrl został naciśnięty przez sprawdzenie czy ev->key()
jest Qt::Key_Control
. Ale jak odróżnić lewe i prawe klawisze?Qt LEFT CTRL klucz kod
muszę również samo dla Alt i SHIFT kluczy.
W Qt QKeyEvent
mogę sprawdzić czy Ctrl został naciśnięty przez sprawdzenie czy ev->key()
jest Qt::Key_Control
. Ale jak odróżnić lewe i prawe klawisze?Qt LEFT CTRL klucz kod
muszę również samo dla Alt i SHIFT kluczy.
Nie można tego zrobić, używając czystych metod Qt
, o ile wiem.
W zależności od platformy może być jednak możliwe rozróżnienie kluczy przy użyciu metody QKeyEvent::nativeScanCode()
zamiast QKeyEvent::key()
.
Na przykład w systemie Windows należy być w stanie przetestować który Ctrl klawisz został naciśnięty w następujący sposób:
if (event->nativeScanCode() == VK_LCONTROL) {
// left control pressed
} else if (event->nativeScanCode() == VK_RCONTROL) {
// right control pressed
}
Tak więc w Windows 'nativeScanCode()' powinien powrócić zgodnie z http://msdn.microsoft.com/en-us/library/ms927178.aspx Który prawdopodobnie to nie robi. Myślę więc, że muszę rozróżnić normalną alfę/cyfry i klawisze kontrolne. ale jaka jest ogólna funkcja, która mówi, że jest to klucz alfanumeryczny i jest to klawisz ALT/SHIFT/CTRL/BACK/.....? –
@DiproSen: Po prostu spróbuj przetestować przed 'VK_LCONTROL' itd. – houbysoft
naprawdę? czy to takie proste? Siedziałem bezczynnie myśląc, czy to zadziała, czy nie. Czy jednak źle traktować klawisze w lewo/w prawo jako takie same? –
lewo iw prawo są częścią kodu klucza wirtualnego -> użyj nativeVirtualKey(), aby porównać z oknami VK_ * wylicza zamiast nativescancode().
Zgodnie z Qt Namespace Reference, enum Qt::Key
ma inną wartość dla Qt::Key_Alt
i Qt::Key_AltGr
.
Jednak enum Qt::KeyboardModifier
i enum Qt::Modifier
nie widzą pary kluczy jako różnych modyfikatorów.
(uwaga: Ja bym pisał to jako komentarz, ale nie mam wystarczająco dużo jeszcze rep.)
Jeśli VK_RCONTROL nie działa, sprawdź swoją wartość nativeScanCode Ctrl-prawo:
std :: cout < nativeScanCode(); i użyj tej wartości:
int control_right = 285; if (key-> nativeScanCode() == control_right) {...
Dlaczego chcesz? To byłby koszmar użyteczności. Dla użytkownika klucze są takie same i używasz ich na podstawie tego, który z nich znajduje się bliżej najbliższego palca w danym momencie. Takie rzeczy mają sens jedynie w grach. Czy to jest gra? –
@KubaOber Jednym z przypadków użycia są skróty klawiaturowe. Na przykład Lewy Alt + Shift zmienia klawiaturę w systemie Windows. Rozróżnienie jest ważne. –
@ Andrew-Dufresne Jak to jest ważne? System operacyjny obsługuje skrót przełączania klawiatury, aplikacja nie może nic z tym zrobić. Po prostu otrzyma prawy Alt, nigdy go nie opuści. Możliwość rozróżnienia tych dwóch nie zmieni zachowania, więc nie ma sensu. –