Код клавиши Qt LEFT CTRL

В Qt QKeyEvent я могу проверить, был ли нажат Ctrl, проверив, является ли ev->key() Qt::Key_Control. Но как мне различить левую и правую клавиши Ctrl?

Мне также нужно то же самое для клавиш Alt и Shift.


person Dipro Sen    schedule 01.07.2012    source источник
comment
Зачем вам это нужно? Это был бы кошмар юзабилити. Для пользователя эти клавиши одинаковы, и вы используете их в зависимости от того, какая из них находится ближе всего к вашему пальцу в данный момент. Такие вещи имеют смысл только для игр. Это игра?   -  person Kuba hasn't forgotten Monica    schedule 02.07.2012
comment
@KubaOber Один из вариантов использования — сочетания клавиш. Например, левый ‹kbd›Alt‹/kbd›+‹kbd›Shift‹/kbd› меняет клавиатуру в Windows. Здесь важно различие.   -  person Andrew-Dufresne    schedule 20.01.2016
comment
@ Эндрю-Дюфресн Насколько это важно? ОС обрабатывает сочетание клавиш, приложение ничего не может с этим поделать. Он просто получит правый альт, а не левый. Если он сможет различать два, это не изменит поведение, поэтому это бессмысленно.   -  person Kuba hasn't forgotten Monica    schedule 20.01.2016
comment
@KubaOber Я разрабатываю приложение для удаленного рабочего стола с использованием Qt. Скажем, пользователь подключен к удаленному компьютеру Windows с локального компьютера Windows. Он хочет переключить клавиатуру на удаленной машине, используя сочетание клавиш левый Alt+Shift. Теперь мое приложение должно различать Alt и Left Alt, чтобы удаленный конец получал Left Alt, а не только клавишу Alt. Это случай использования, когда различие важно.   -  person Andrew-Dufresne    schedule 21.01.2016


Ответы (4)


Насколько я знаю, это невозможно сделать с помощью чистых методов Qt.

Однако в зависимости от вашей платформы вы можете различать ключи с помощью QKeyEvent::nativeScanCode() вместо QKeyEvent::key().

Например, в Windows вы сможете проверить, какая клавиша Ctrl была нажата, следующим образом:

if (event->nativeScanCode() == VK_LCONTROL) {
  // left control pressed
} else if (event->nativeScanCode() == VK_RCONTROL) {
  // right control pressed
}
person houbysoft    schedule 01.07.2012
comment
Таким образом, в Windows nativeScanCode() должен возвращаться в соответствии с msdn.microsoft.com/en-us/ library/ms927178.aspx Что, вероятно, не так. Поэтому я думаю, что мне нужно различать обычные буквы/цифры и клавиши управления. но какова общая функция, которая сообщает, что это буквенно-цифровая клавиша, а это клавиша ALT/SHIFT/CTRL/BACK/.....? - person Dipro Sen; 01.07.2012
comment
@DiproSen: просто попробуйте протестировать VK_LCONTROL и т. д. - person houbysoft; 01.07.2012
comment
В самом деле ? это так легко? Я просто сидел без дела и думал, получится или нет. Однако плохо ли относиться к левой/правой клавишам одинаково? - person Dipro Sen; 01.07.2012
comment
@DiproSen: я не проверял это, но я считаю, что это должно работать. И wdym, плохо ли обращаться с левой/правой клавишами одинаково? В этом нет ничего плохого, просто зависит от того, что вам нужно в вашем приложении... - person houbysoft; 01.07.2012

Согласно справочнику по пространству имен Qt, enum Qt::Key имеет другое значение для Qt::Key_Alt и Qt::Key_AltGr.

Однако enum Qt::KeyboardModifier и enum Qt::Modifier не рассматривают пару ключей как разные модификаторы.

(примечание: я бы опубликовал это как комментарий, но у меня пока недостаточно представителей)

person Sparkler    schedule 06.06.2014

Левая и правая клавиши являются частью кода виртуальной клавиши -> используйте nativeVirtualKey() для сравнения с перечислениями окон VK_* вместо nativescancode().

person user3220529    schedule 21.01.2014

Если VK_RCONTROLне работает, проверьте значение nativeScanCode ctrl-right:

std::cout<<keyEvent->nativeScanCode(); и используйте это значение:

int control_right = 285;
if(key->nativeScanCode() == control_right){...
person Benj    schedule 15.04.2017