Qt keyPressEvent не вызывается должным образом, когда УДЕРЖИВАНИЕ определенных клавиш (клавиша Shift)

Обычно, когда клавиша удерживается, функция keyPressEvent вызывается так часто, как установлено значение QApplication::keyboardInputInterval(). Однако он не работает для таких клавиш, как shift, ctrl или alt.

это выполняется правильно:

void Renderer::keyPressEvent(QKeyEvent *event)
{
  if(event->key() == Qt::Key_Escape) qDebug() << "executing";
}

это выполняется только один раз при нажатии кнопки:

void Renderer::keyPressEvent(QKeyEvent *event)
{
  if(event->key() == Qt::Key_Shift) qDebug() << "executing";
}

разница только в Qt::Key_Shift и Qt::Key_Escape. Кто-нибудь знает, как это исправить?


person user3364192    schedule 28.02.2014    source источник


Ответы (3)


Вы можете сделать следующее.

if(QApplication::keyboardModifiers() & Qt::ShiftModifier)
{
     //Things need to do while holding SHIFT key.
}

else
{
     //Things need to do while not holding SHIFT key.
}
person Hareen Laks    schedule 29.09.2014

Это по дизайну. Клавиши-модификаторы не имеют автоповтора, это было бы бессмысленно. Они либо вниз, либо вверх.

Если вам это нужно (зачем?), вам нужно реализовать автоповтор ключа модификатора самостоятельно.

person Kuba hasn't forgotten Monica    schedule 28.02.2014
comment
Спасибо за ответ, я попробую это. Мне нужен отрисовываемый объект QGraphicsLineItem (что-то вроде многих графических редакторов, где можно зажать Shift и линию можно повернуть только на 45*n градусов) - person user3364192; 28.02.2014

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

bool shiftHeld = false;

void keyPressEvent(QKeyEvent *event) {
  if(event->key() == Qt::Key_Shift)
    shiftHeld = true;
}

void keyReleaseEvent(QKeyEvent *event) {
  if(event->key() == Qt::Key_Shift)
    shiftHeld = false;
}

Просто проверьте переменную shiftHeld, чтобы узнать, удерживается ли сдвиг в данный момент, и соответствующим образом измените поведение вашего приложения.

person MaverickXero    schedule 13.08.2014