Вопрос по – Поймать освобождение ключа модификатора Qt

4

Я новичок в Qt, но я пытаюсь реализовать то, что в основном равнозначно циклу ввода видеоигр в приложении Qt (без ума, я знаю, но посмотрим, сможете ли вы помочь). Мне нужна точная, однозначная обработка событий для нажатия клавишand ключевые выпуски, для всех клавиш, включая модификаторы, независимо от того, как странно вы настраиваете клавиатуру.

Конечно, ваш основной доступ к ключевым событиям черезQKeyEvent, Но допустим, что происходит следующее:

user presses and holds Ctrl user presses and holds Up user releases Ctrl and Up simultaneously

Насколько я могу судить, что я получаю от Qt:

QKeyEvent for the pressing of Ctrl, by itself (Qt::Key_Ctrl) QKeyEvent for the pressing of Up, by itself (Qt::Key_Up) QKeyEvent for the releasing of Ctrl+Up, with key() == Qt::Key_Up and the Ctrl bit reflected in a modifier change.

Это может быть не совсем точно, но это мое лучшее предположение относительно того, что происходит из-за слишком большой отладки проблемы. В любом случае ключrelease события, когда участвуют модификаторыincredibly ненадежный.

Последовательность Ctrl + Up в конце - это проблема. Теперь я знаю, что получаю состояние модификатора вe->modifiers()и я получаю нажатие клавишиe->key(), Я мог бы сделать несколько сложных хаков, пытаясь запомнить внутреннее состояние модификатора, чтобы определить, когда пользователь выпустил модификатор. Но затем Qt Docs информирует меня, говоря оe->modifiers(), тот:

This function cannot always be trusted. The user can confuse it by pressing both Shift keys simultaneously and releasing one of them, for example.

Это именно тот случай, когда я пытаюсьavoid.

Есть ли надежный способ отслеживать нажатия и отпускания клавиш «один-к-одному», как для обычных, так и для клавиш-модификаторов, в Qt? Если нет, то что вы можете получить ближе всего?

EDIT: Я могу немного уточнить это. Кажется, что если вы удерживаетеCmd на Mac нажмите несколько клавиш (скажем, буквенных), отпустите их, затем отпуститеCmd, выdon't get release events for the letter key releases.  Я попытаюсь выделить небольшой пример и посмотреть, действительно ли это ошибка Qt.

Ваш Ответ

2   ответа
0

Я знаю, что уже поздно отвечать на этот вопрос. Тем не менее ... У меня та же проблема с событиями выпуска ключей Mac, и есть открытая ошибка QTBUG-36839. В Windows вы можете реализовать хук клавиатуры, чтобы ловить каждое нажатие / отпускание клавиши. Но даже это не надежно в некоторых случаях. Например. Если после разблокировки вы наберете ярлык экрана блокировки, вы НЕ увидите никаких нажатий клавиш. Я думаю, что должно быть что-то похожее на крючок на Mac. Если вам важно запомнить, какую именно физическую клавишу нажал пользователь - я думаю, это один из лучших способов. В то же время, исходя из моего опыта, выполнение чего-то низкого уровня занимает много времени и может привести к странным ошибкам в случаях, которые вы никогда не могли себе представить. Итак, вопрос: вы уверены, что не можете сделать то, что вам нужно, с помощью чего-то вроде QAction? Или, может быть, вы могли бы просто использовать Control вместо Command в ваших ярлыках :)

2

Я думаю, что если вы сильно разбираетесь в клавиатуре, вам нужно оставить Qt и получить что-то, зависящее от ОС, или вам нужно обработать события Qt до того, как произойдет какая-либо фильтрация.

Handle Qt Events Before Filtering

Ускорители в Qt ищут и ждут в комбинациях Alt + __, и вы можете настроить комбинации Ctrl + __ для прослушивания QAction.

Оба этих типа объектов, встроенные в QApplication и общую среду графического интерфейса, могут прерывать получаемые вами сообщения и давать вам меньше, чем вы ожидаете.

Документация Qt: Система событий  ... эта часть имеет ссылку на это ...

QCoreApplication :: Notify () ... который сообщает наивысший уровень, что приложение Qt может быть написано для обработки ввода с использованием API Qt:

Installing an event filter on QCoreApplication::instance(). Such an event filter is able to process all events for all widgets, so it's just as powerful as reimplementing notify(); furthermore, it's possible to have more than one application-global event filter. Global event filters even see mouse events for disabled widgets. Note that application event filters are only called for objects that live in the main thread.

OS Specific Keyboard Handling Alternative

Если просмотр инструкций отладки из фильтра событий Qt, установленного на уровне, указанном выше, дает те же результаты, что вы упоминали в своем вопросе, то вам нужно будет перейти к конкретным операциям ввода с клавиатуры. Например, в Windows вам нужно будет отсканировать клавиатуру и / или посмотреть состояние VK всей клавиатуры и что-то с ней сделать (с чем-то вродеGetKeyboardState() ).

Похожие вопросы