Проверьте, не работает ли ключ с Qt - PullRequest
11 голосов
/ 13 сентября 2011

Я играю с некоторой графикой, и я реализовал простое движение камеры с помощью клавиш со стрелками.Мой первый подход состоял в том, чтобы переопределить keyPressEvent, чтобы сделать что-то вроде этого:

switch(key)
{
   case up: MoveCameraForward(step); break;
   case left: MoveCameraLeft(step); break;
   ...
}

Это не сработает так, как хотелось бы.Когда я нажимаю и удерживаю, например, клавишу «вперед», камера перемещает «шаговые» единицы вперед, затем на некоторое время останавливается, а затем продолжает движение.Я предполагаю, что именно так генерируется событие, чтобы избежать нескольких событий в случае немного длинного нажатия клавиши.

Итак, мне нужно опросить клавиатуру в моей подпрограмме Paint().Я не нашел, как это сделать с Qt.Я думал о map<Key, bool>, который будет обновлен в keyPressEvent и keyReleaseEvent и опросить эту карту в Paint().Есть идеи получше?Спасибо за любые идеи.

Ответы [ 4 ]

9 голосов
/ 04 ноября 2014

Это не решает общую проблему определения того, какие клавиши нажаты, но если вы ищете только модификаторы клавиатуры (shift, ctrl, alt и т. Д.), Вы можете получить это через статический QApplication::keyboardModifiers() и QApplication::queryKeyboardModifiers() методы.

6 голосов
/ 13 сентября 2011

Итак, мне нужно опросить клавиатуру в моей программе Paint (). Я не нашел как это сделать с помощью Qt. Я думал о карте, которая обновляться в keyPressEvent и keyReleaseEvent и опрашивать эту карту в Краска ().

Ваш второй метод - то, что я бы сделал, за исключением того, что я использовал бы непрерывное периодическое событие QTimer для опроса карты с нажатой клавиатурой и вызова функции QWidget :: Update (), когда это необходимо, чтобы сделать недействительным виджет отображения. Выполнение операций без рисования внутри Paint () настоятельно не рекомендуется по многим причинам, но я не знаю, как это объяснить.

3 голосов
/ 13 сентября 2011

Нет Qt API для проверки, нажата ли клавиша или нет. Возможно, вам придется написать отдельный код для разных платформ и добавить немного логики #ifdef.

В Windows вы можете использовать GetKeyState() и GetKeyboardState(), оба объявлены в windows.h.

2 голосов
/ 13 сентября 2011

Это не так просто при использовании Qt, но команда Gluon работает именно над этой проблемой (вместе со многими другими).GluonInput решает проблему и доступен как часть Gluon: http://gluon.gamingfreedom.org/ Это также хороший, Qt-подобный API, так что, хотя это дополнительная зависимость, у вас должна быть возможность использовать его.

...