Qt catch shift + 3 при нажатии одной клавиши - PullRequest
0 голосов
/ 27 ноября 2018

Я использую Qt 5.11.

Мне нужно поймать shift + 3 одним нажатием клавиши.Но эта комбинация генерирует специальный символ ^, потому что я использую клавиатуру Turkish Q.Поэтому я не могу поймать его без повторного нажатия shift + 3.

Я пробовал модификаторы сдвига и решения для нескольких нажатий клавиш, но не работает.

Я хочу переопределить ^.Есть ли возможные способы сделать это?

1 Ответ

0 голосов
/ 27 ноября 2018

Попробуйте следующее, это может работать.Хотя согласно документации nativeVirtualKey может возвращать 0, даже если имеется действительная информация.Так что не уверен, будет ли это работать все время.Я проверил это с немецкой, английской и арабской клавиатурой.

Обновление (проверено на раскладке турецкой клавиатуры)

void keyPressEvent(QKeyEvent *ev)
{
    if ((ev->nativeVirtualKey() == Qt::Key_3 || ev->key() == Qt::Key_3)  && ev->modifiers()  == Qt::ShiftModifier)
    {
        //Do something
    }
}

Для раскладки на турецком языке, ^ вставка (мертвая клавиша), в дополнение к вышесказанному, вы можете поймать нажатие мертвой клавиши, нажавпереопределение функции nativeEvent и вызов функции keyEvent вручную

bool nativeEvent(const QByteArray & eventType, void * message, long * result)
{
    MSG *msg = reinterpret_cast<MSG*>(message);
    if (msg->message == WM_DEADCHAR)
    {
        QKeyEvent *key = new QKeyEvent(QEvent::KeyPress, Qt::Key_3, Qt::ShiftModifier);
    }
}

Одна незначительная проблема - вызывается keyEvent даже при нажатии ^ на другом языке, не обязательно только с Shift + 3, так что это неожиданноповедение, но, возможно, для вашего случая вы можете сказать пользователю, что оба Shift + 3 или ^ являются ярлыком для вашей конкретной функции

...