Russian Qt Forum
Ноябрь 24, 2024, 12:32
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Общие вопросы
>
Обработка одновременного нажатия клавиш на клаве
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Обработка одновременного нажатия клавиш на клаве (Прочитано 10693 раз)
~nik~
Гость
Обработка одновременного нажатия клавиш на клаве
«
:
Сентябрь 13, 2010, 19:09 »
Здравствуйте, уважаемые программисты!
Я буду вам весьма признателен,если вы поможете мне разобраться в следующей проблеме. Я думаю удобнее всего будет ее объяснить на примере. Пусть у нас в окне есть какой-то объект, при нажатии Key_Right он движется вправо, при нажатии Key_Down он движется вниз. Если я зажимаю Key_Right, а затем жму Key_Down, то объект движется ТОЛЬКО вниз,игнорируя то,что Key_Right все еще зажата. Я естественно ожидаю получить в таком случае движение по диагонали. Так вот вопрос, как это сделать)
Заранее спасибо,за любую помощь.
Записан
ufna
Гость
Re: Обработка одновременного нажатия клавиш на клаве
«
Ответ #1 :
Сентябрь 13, 2010, 19:30 »
Создай QMap<> нажатий. Когда нажимают кнопку - добавляй в него значение. Отпустили - удаляй. Таким образом в нем у тебя всегда будет набор текущих нажатых одновременно клавишь.
Записан
Denjs
Гость
Re: Обработка одновременного нажатия клавиш на клаве
«
Ответ #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~
Гость
Re: Обработка одновременного нажатия клавиш на клаве
«
Ответ #3 :
Сентябрь 14, 2010, 21:28 »
Спасибо за советы. Ну с QMap мне пришла единственная идея решения: действительно, записывать клавишу при нажатии, удалять при отпускании, и в таймере вызывать обработчик событий нажатия, передавая ему клавиши, записанные в данный момент в QMap, но на деле все равно не очень четко выходит: то обрабатываются две клавиши,то нет(( Я просто думал, может в qt есть какой-то стандартный механизм сделать это.
P.S. Denjs не могли бы вы поподробнее рассказать о классе KeyPressEater, я что-то не смог найти его в ассистанте (вроде бы в qt названия всех классов начинаются с Q).
Записан
ufna
Гость
Re: Обработка одновременного нажатия клавиш на клаве
«
Ответ #4 :
Сентябрь 14, 2010, 21:48 »
Таймер не нужен, зачем? Это нужно смотреть именно в keyPressEvente, после добавления текущей клавиши.
Записан
~nik~
Гость
Re: Обработка одновременного нажатия клавиш на клаве
«
Ответ #5 :
Сентябрь 14, 2010, 22:22 »
Спасибо,да я че то ступил) Ну теперь все нормально в плане того,что корректно обрабатывается одновременное нажатие двух клавиш. К сожалению, у меня задача несколько посложнее: я хочу,чтобы когда я нажимаю клавишу при уже зажатой другой клавише, они обе обрабатывались. И тут,на мой взгляд, сложность вот в чем (поправьте меня пожалуйста,если я неправ): к сожалению qt интерпретирует зажатую клавишу как последовательность нажиманий и отпусканий. И если я при зажатой клавише(обозначим ее A) нажимаю другую(обозначим ее B), то нажатие B "перебивает" очередной элемент последовательности нажимания клавиши A. И тем самым зажатая клавиша A воспринимается как отпущенная.
Записан
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3260
Re: Обработка одновременного нажатия клавиш на клаве
«
Ответ #6 :
Сентябрь 14, 2010, 22:24 »
у вас приходит эвент autorepeat для последней нажатой клавиши. Запоминая нажатия, вам не не важно, в каком порядке вы их нажали - важен лишь сам факт эвента
Записан
~nik~
Гость
Re: Обработка одновременного нажатия клавиш на клаве
«
Ответ #7 :
Сентябрь 14, 2010, 22:35 »
Проблема в том,что когда нажатие "B" перебивает очередной элемент последовательности нажатия клавиши "A" , эта клавиша (A) в QMap не записывается (я ее оттуда удалил,когда произошло ее "отпускание", а записаться она не успела,ибо ее "опередила" клавиша "B"). Странно правда почему не происходит повторного события нажатия "A",ведь она все время остается зажатой...?
Записан
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3260
Re: Обработка одновременного нажатия клавиш на клаве
«
Ответ #8 :
Сентябрь 14, 2010, 22:46 »
как у вас А удаляется из мапы, если она не была отпущена?
Записан
Kolobok
Гость
Re: Обработка одновременного нажатия клавиш на клаве
«
Ответ #9 :
Сентябрь 14, 2010, 23:54 »
Немного не в тему. Почему QMap, а не QSet? Нужно ведь только код клавиши сохранять.
Записан
Denjs
Гость
Re: Обработка одновременного нажатия клавиш на клаве
«
Ответ #10 :
Сентябрь 15, 2010, 11:38 »
Цитата: ~nik~ от Сентябрь 14, 2010, 21:28
P.S. Denjs не могли бы вы поподробнее рассказать о классе KeyPressEater, я что-то не смог найти его в ассистанте (вроде бы в qt названия всех классов начинаются с Q).
Это из примеров.
читайте описание
Цитировать
void QObject::installEventFilter ( QObject * filterObj )
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...