Russian Qt Forum
Ноябрь 24, 2024, 14:25 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Обработка одновременного нажатия клавиш на клаве  (Прочитано 10703 раз)
~nik~
Гость
« : Сентябрь 13, 2010, 19:09 »

Здравствуйте, уважаемые программисты!

Я буду вам весьма признателен,если вы поможете мне разобраться в следующей проблеме. Я думаю удобнее всего будет ее объяснить на примере. Пусть у нас в окне есть какой-то объект, при нажатии Key_Right он движется вправо, при нажатии Key_Down он движется вниз. Если я зажимаю Key_Right, а затем жму Key_Down, то объект движется ТОЛЬКО вниз,игнорируя то,что Key_Right все еще зажата. Я естественно ожидаю получить в таком случае движение по диагонали. Так вот вопрос, как это сделать)

Заранее спасибо,за любую помощь.
Записан
ufna
Гость
« Ответ #1 : Сентябрь 13, 2010, 19:30 »

Создай QMap<> нажатий. Когда нажимают кнопку - добавляй в него значение. Отпустили - удаляй. Таким образом в нем у тебя всегда будет набор текущих нажатых одновременно клавишь.
Записан
Denjs
Гость
« Ответ #2 : Сентябрь 13, 2010, 20:03 »

Кажетсч вопрос стоит в том, как отловить не только события нажатия клавиатуры но и события отжатия - что бы можно бвло отследить что нажато а что нет.

Автору предлагается почитать про
 * void QObject::installEventFilter ( QObject * filterObj )
 * QKeyEvent

Данных в ассистанте думаю будет достаточно для написания кода, который будет отслеживать что нажато в текущий момент на основании событий нажатия и отпуская клавиш. В ассистанте как раз пример про class KeyPressEater - который "жрет" нажатия клавиш.

Надо просто не фильтровать клавиши, а регистрировать их события. Естественно не только когда "event->type() == QEvent::KeyPress" но и когда "event->type() == QEvent::KeyRelease"
« Последнее редактирование: Сентябрь 14, 2010, 01:53 от Denjs » Записан
~nik~
Гость
« Ответ #3 : Сентябрь 14, 2010, 21:28 »

Спасибо за советы. Ну с QMap мне пришла единственная идея решения: действительно, записывать клавишу при нажатии, удалять при отпускании, и в таймере вызывать обработчик событий нажатия, передавая ему клавиши, записанные в данный момент в QMap, но на деле все равно не очень четко выходит: то обрабатываются две клавиши,то нет(( Я просто думал, может в qt есть какой-то стандартный механизм сделать это.

P.S. Denjs не могли бы вы поподробнее рассказать о классе KeyPressEater, я что-то не смог найти его в ассистанте (вроде бы в qt названия всех классов начинаются с Q).
Записан
ufna
Гость
« Ответ #4 : Сентябрь 14, 2010, 21:48 »

Таймер не нужен, зачем? Это нужно смотреть именно в keyPressEvente, после добавления текущей клавиши.
Записан
~nik~
Гость
« Ответ #5 : Сентябрь 14, 2010, 22:22 »

Спасибо,да я че то ступил) Ну теперь все нормально в плане того,что корректно обрабатывается одновременное нажатие двух клавиш. К сожалению, у меня задача несколько посложнее: я хочу,чтобы когда я нажимаю клавишу при уже зажатой другой клавише, они обе обрабатывались. И тут,на мой взгляд, сложность вот в чем (поправьте меня пожалуйста,если я неправ): к сожалению qt интерпретирует зажатую клавишу как последовательность нажиманий и отпусканий. И если я при зажатой клавише(обозначим ее A) нажимаю другую(обозначим ее B), то нажатие B "перебивает" очередной элемент последовательности нажимания клавиши A. И тем самым зажатая клавиша A воспринимается как отпущенная.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #6 : Сентябрь 14, 2010, 22:24 »

у вас приходит эвент autorepeat для последней нажатой клавиши. Запоминая нажатия, вам не не важно, в каком порядке вы их нажали - важен лишь сам факт эвента
Записан
~nik~
Гость
« Ответ #7 : Сентябрь 14, 2010, 22:35 »

Проблема в том,что когда нажатие "B" перебивает очередной элемент последовательности нажатия клавиши "A" , эта клавиша (A) в QMap не записывается (я ее оттуда удалил,когда произошло ее "отпускание", а записаться она не успела,ибо ее "опередила" клавиша "B"). Странно правда почему не происходит повторного события нажатия "A",ведь она все время остается зажатой...?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #8 : Сентябрь 14, 2010, 22:46 »

как у вас А удаляется из мапы, если она не была отпущена?
Записан
Kolobok
Гость
« Ответ #9 : Сентябрь 14, 2010, 23:54 »

Немного не в тему. Почему QMap, а не QSet? Нужно ведь только код клавиши сохранять.
Записан
Denjs
Гость
« Ответ #10 : Сентябрь 15, 2010, 11:38 »

P.S. Denjs не могли бы вы поподробнее рассказать о классе KeyPressEater, я что-то не смог найти его в ассистанте (вроде бы в qt названия всех классов начинаются с Q).
Это из примеров.
читайте описание
Цитировать
void QObject::installEventFilter ( QObject * filterObj )
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.207 секунд. Запросов: 23.