Qt множественное ключевое событие - PullRequest
5 голосов
/ 21 июня 2010

Я использую Qt 4.6 и хотел бы отреагировать на комбинированные комбинации клавиш (например, Key_Q + Key_W), которые удерживаются.Поэтому, когда вы удерживаете комбинацию клавиш, событие должно вызываться постоянно, точно так же, как оно работает с событиями с одной клавишей.Я пытался использовать QShortcuts и включить для них автоповтор, но это не сработало:

keyCombos_.push_back(new QShortcut(QKeySequence(Qt::Key_W, Qt::Key_D), this));
connect(keyCombos_[0], SIGNAL(activated()), SLOT(keySequenceEvent_WD()));
setShortcutAutoRepeat(keyCombos_[0]->id(), true);

При использовании этого подхода у меня также возникает проблема, заключающаяся в том, что я не могу поймать один Key_W (или любой другой ключ)в последовательности ключей есть) ударов больше.

Спасибо, Томас

Ответы [ 2 ]

6 голосов
/ 25 марта 2011

QShortcut не поддерживает функции, которые вы ищете. Вы можете создавать комбинации только с клавишами-модификаторами , такими как Shift, Ctrl, Alt и Meta.

Что делает ваш код, так это создает ярлык, который реагирует, когда пользователь сначала нажимает W, а затем D. По этой же причине он будет конфликтовать с другими ярлыками, которые реагируют только на W.

Если вы хотите что-то сделать, когда одновременно нажимаются и W, и D , вам придется переопределить методы keyPressEvent и keyReleaseEvent QWidget * чтобы отслеживать их нажатие и вручную вызывать функцию-обработчик, когда они оба нажаты. Если у вас нет подходящего подкласса QWidget, вам придется либо ввести его, либо установить фильтр событий в нужном месте, используя QObject :: installEventFilter , возможно, на объекте вашего приложения, если предполагается быть глобальным ярлыком.

3 голосов
/ 23 мая 2014

Вы можете добавить нажатую клавишу к набору нажатых клавиш и удалить из этого набора при отпускании клавиши.Таким образом, вы можете добавить нажатую клавишу в QSet, который является членом класса:

QSet<int> pressedKeys;

Вы можете перехватить ключевые события в фильтре событий:

bool MyWidget::eventFilter(QObject * obj, QEvent * event)
{

    if(event->type()==QEvent::KeyPress) {

        pressedKeys += ((QKeyEvent*)event)->key();

        f( pressedKeys.contains(Qt::Key_D) && pressedKeys.contains(Qt::Key_W) )
        {
            // D and W are pressed
        }

    }
    else if(event->type()==QEvent::KeyRelease)
    {

        pressedKeys -= ((QKeyEvent*)event)->key();
    }


    return false;
}

Не забудьтеустановить фильтр событий в конструкторе:

this->installEventFilter(this);
...