Название: Обработка одновременного нажатия клавиш на клаве Отправлено: ~nik~ от Сентябрь 13, 2010, 19:09 Здравствуйте, уважаемые программисты!
Я буду вам весьма признателен,если вы поможете мне разобраться в следующей проблеме. Я думаю удобнее всего будет ее объяснить на примере. Пусть у нас в окне есть какой-то объект, при нажатии Key_Right он движется вправо, при нажатии Key_Down он движется вниз. Если я зажимаю Key_Right, а затем жму Key_Down, то объект движется ТОЛЬКО вниз,игнорируя то,что Key_Right все еще зажата. Я естественно ожидаю получить в таком случае движение по диагонали. Так вот вопрос, как это сделать) Заранее спасибо,за любую помощь. Название: Re: Обработка одновременного нажатия клавиш на клаве Отправлено: ufna от Сентябрь 13, 2010, 19:30 Создай QMap<> нажатий. Когда нажимают кнопку - добавляй в него значение. Отпустили - удаляй. Таким образом в нем у тебя всегда будет набор текущих нажатых одновременно клавишь.
Название: Re: Обработка одновременного нажатия клавиш на клаве Отправлено: Denjs от Сентябрь 13, 2010, 20:03 Кажетсч вопрос стоит в том, как отловить не только события нажатия клавиатуры но и события отжатия - что бы можно бвло отследить что нажато а что нет.
Автору предлагается почитать про * void QObject::installEventFilter ( QObject * filterObj ) * QKeyEvent Данных в ассистанте думаю будет достаточно для написания кода, который будет отслеживать что нажато в текущий момент на основании событий нажатия и отпуская клавиш. В ассистанте как раз пример про class KeyPressEater - который "жрет" нажатия клавиш. Надо просто не фильтровать клавиши, а регистрировать их события. Естественно не только когда "event->type() == QEvent::KeyPress" но и когда "event->type() == QEvent::KeyRelease" Название: Re: Обработка одновременного нажатия клавиш на клаве Отправлено: ~nik~ от Сентябрь 14, 2010, 21:28 Спасибо за советы. Ну с QMap мне пришла единственная идея решения: действительно, записывать клавишу при нажатии, удалять при отпускании, и в таймере вызывать обработчик событий нажатия, передавая ему клавиши, записанные в данный момент в QMap, но на деле все равно не очень четко выходит: то обрабатываются две клавиши,то нет(( Я просто думал, может в qt есть какой-то стандартный механизм сделать это.
P.S. Denjs не могли бы вы поподробнее рассказать о классе KeyPressEater, я что-то не смог найти его в ассистанте (вроде бы в qt названия всех классов начинаются с Q). Название: Re: Обработка одновременного нажатия клавиш на клаве Отправлено: ufna от Сентябрь 14, 2010, 21:48 Таймер не нужен, зачем? Это нужно смотреть именно в keyPressEvente, после добавления текущей клавиши.
Название: Re: Обработка одновременного нажатия клавиш на клаве Отправлено: ~nik~ от Сентябрь 14, 2010, 22:22 Спасибо,да я че то ступил) Ну теперь все нормально в плане того,что корректно обрабатывается одновременное нажатие двух клавиш. К сожалению, у меня задача несколько посложнее: я хочу,чтобы когда я нажимаю клавишу при уже зажатой другой клавише, они обе обрабатывались. И тут,на мой взгляд, сложность вот в чем (поправьте меня пожалуйста,если я неправ): к сожалению qt интерпретирует зажатую клавишу как последовательность нажиманий и отпусканий. И если я при зажатой клавише(обозначим ее A) нажимаю другую(обозначим ее B), то нажатие B "перебивает" очередной элемент последовательности нажимания клавиши A. И тем самым зажатая клавиша A воспринимается как отпущенная.
Название: Re: Обработка одновременного нажатия клавиш на клаве Отправлено: Авварон от Сентябрь 14, 2010, 22:24 у вас приходит эвент autorepeat для последней нажатой клавиши. Запоминая нажатия, вам не не важно, в каком порядке вы их нажали - важен лишь сам факт эвента
Название: Re: Обработка одновременного нажатия клавиш на клаве Отправлено: ~nik~ от Сентябрь 14, 2010, 22:35 Проблема в том,что когда нажатие "B" перебивает очередной элемент последовательности нажатия клавиши "A" , эта клавиша (A) в QMap не записывается (я ее оттуда удалил,когда произошло ее "отпускание", а записаться она не успела,ибо ее "опередила" клавиша "B"). Странно правда почему не происходит повторного события нажатия "A",ведь она все время остается зажатой...?
Название: Re: Обработка одновременного нажатия клавиш на клаве Отправлено: Авварон от Сентябрь 14, 2010, 22:46 как у вас А удаляется из мапы, если она не была отпущена?
Название: Re: Обработка одновременного нажатия клавиш на клаве Отправлено: Kolobok от Сентябрь 14, 2010, 23:54 Немного не в тему. Почему QMap, а не QSet? Нужно ведь только код клавиши сохранять.
Название: Re: Обработка одновременного нажатия клавиш на клаве Отправлено: Denjs от Сентябрь 15, 2010, 11:38 P.S. Denjs не могли бы вы поподробнее рассказать о классе KeyPressEater, я что-то не смог найти его в ассистанте (вроде бы в qt названия всех классов начинаются с Q). Это из примеров. читайте описание Цитировать void QObject::installEventFilter ( QObject * filterObj ) |