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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: вопрос к eventFilter(обработка клавиатуры)  (Прочитано 6837 раз)
nik135
Гость
« : Апрель 26, 2008, 14:09 »

Потребовалось организовать управление с клавиатуры, попробовал через eventFilter, вроде работает, но по одной клавише, т.е. если в нажимать последовательно клавиши, то все работает, а если одновременно две или три, то работает  только как будто нажата одна :-(

как поймать одновременное нажатие нескольких клавиш?
Записан
Sergeich
Гость
« Ответ #1 : Апрель 26, 2008, 14:20 »

см. QShortcut
Записан
nik135
Гость
« Ответ #2 : Апрель 26, 2008, 15:23 »

Попробовал, не помогло, два Shortcut'a одновременно не выполняются.

Еще идеи?

зы. можно попробовать конечно описать все возможные сочетания клавиш, но мне кажется это не есть гуд...
Записан
Sergeich
Гость
« Ответ #3 : Апрель 26, 2008, 21:11 »

Чей-то я не понял что ты решил замутить. Кинь примером.
Записан
nik135
Гость
« Ответ #4 : Апрель 27, 2008, 10:53 »

Код:

bool t::eventfilter(qobject *obj, qevent *event)
 {
         if (event->type() == qevent::keypress) {
             qkeyevent *keyevent = static_cast<qkeyevent*>(event);
if (keyevent->key()==qt::key_w)emit wevent();
if (keyevent->key()==qt::key_a)emit aevent();
if (keyevent->key()==qt::key_s)emit sevent();
if (keyevent->key()==qt::key_d)emit devent();
             return true;
         } else {
return qobject::eventfilter(obj, event);
         }
 }


Так вот, при одновременнном нажатии двух клавиш, этот код работает, как будто нажали одну из этих двух.
И при использовании QShortcut происходит то же самое.

Скорее всего я дурак,и мне хотелось бы чтобы мне пояснили, где именно.
Записан
Sergey B.
Программист
*****
Offline Offline

Сообщений: 544



Просмотр профиля WWW
« Ответ #5 : Апрель 27, 2008, 12:06 »

Не совсем понятно, что нужно в конечном итоге... Сформулируйте точнее.

Если я правильно понял...
В Qt есть возможность проверять модификаторы. Поищите на эту тему.
У меня это делается вот так:
Код:
        if (event->type() == QEvent::KeyPress)
          {
            QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
            if (keyEvent->key() == Qt::Key_Enter || keyEvent->key()
                == Qt::Key_Return)
              {
                if (keyEvent->modifiers() & Qt::ControlModifier)
                  {
                    /*!this "if" statement is needed for opening edit dialog when control key is pressed.*/
                    return false;
                  }
                focusNextChild();
                return true;
              }
          }

Это для обхода элементов диалога, по клавише Enter.
Статус модификатора проверяется здесь.
Код:
if (keyEvent->modifiers() & Qt::ControlModifier)
« Последнее редактирование: Апрель 27, 2008, 12:08 от Sergey B. » Записан
nik135
Гость
« Ответ #6 : Апрель 27, 2008, 16:48 »

Не совсем понятно, что нужно в конечном итоге... Сформулируйте точнее.

Если я правильно понял...
В Qt есть возможность проверять модификаторы. Поищите на эту тему.

Сергей, хочется повесить по определенному действию на каждую клавишу клавиатуры. Т.е. нажатие на клавишу "W"- Одно действие(сигнал), нажатие на клавишу "A"- другое действие(сигнал). Если нажимать одну клавишу, или одну или вторую, то все работает. Если одновременно нажать "W" и "A" - работает либо сигнал клавиши "W" либо сигнал клавиши "A".
А хочется, чтобы происходило два  сигнала. Вот. Может, я не очень ясно выражаю мысли, если не ясно, я еще раз попытаюсь объяснить.  Улыбающийся
Записан
Sergey B.
Программист
*****
Offline Offline

Сообщений: 544



Просмотр профиля WWW
« Ответ #7 : Апрель 27, 2008, 17:16 »

Не то?
Код:
void QWidget::grabKeyboard ()
Grabs the keyboard input.
This widget receives all keyboard events until releaseKeyboard() is called; other widgets get no keyboard events at all. Mouse events are not affected. Use grabMouse() if you want to grab that.
The focus widget is not affected, except that it doesn't receive any keyboard events. setFocus() moves the focus as usual, but the new focus widget receives keyboard events only after releaseKeyboard() is called.
If a different widget is currently grabbing keyboard input, that widget's grab is released first.
See also releaseKeyboard(), grabMouse(), releaseMouse(), and focusWidget().
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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