Russian Qt Forum

Qt => Общие вопросы => Тема начата: nik135 от Апрель 26, 2008, 14:09



Название: вопрос к eventFilter(обработка клавиатуры)
Отправлено: nik135 от Апрель 26, 2008, 14:09
Потребовалось организовать управление с клавиатуры, попробовал через eventFilter, вроде работает, но по одной клавише, т.е. если в нажимать последовательно клавиши, то все работает, а если одновременно две или три, то работает  только как будто нажата одна :-(

как поймать одновременное нажатие нескольких клавиш?


Название: Re: вопрос к eventFilter(обработка клавиатуры)
Отправлено: Sergeich от Апрель 26, 2008, 14:20
см. QShortcut


Название: Re: вопрос к eventFilter(обработка клавиатуры)
Отправлено: nik135 от Апрель 26, 2008, 15:23
Попробовал, не помогло, два Shortcut'a одновременно не выполняются.

Еще идеи?

зы. можно попробовать конечно описать все возможные сочетания клавиш, но мне кажется это не есть гуд...


Название: Re: вопрос к eventFilter(обработка клавиатуры)
Отправлено: Sergeich от Апрель 26, 2008, 21:11
Чей-то я не понял что ты решил замутить. Кинь примером.


Название: Re: вопрос к eventFilter(обработка клавиатуры)
Отправлено: nik135 от Апрель 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 происходит то же самое.

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


Название: Re: вопрос к eventFilter(обработка клавиатуры)
Отправлено: Sergey B. от Апрель 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)


Название: Re: вопрос к eventFilter(обработка клавиатуры)
Отправлено: nik135 от Апрель 27, 2008, 16:48
Не совсем понятно, что нужно в конечном итоге... Сформулируйте точнее.

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

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


Название: Re: вопрос к eventFilter(обработка клавиатуры)
Отправлено: Sergey B. от Апрель 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().