QKeySequence to QKeyEvent

Я нахожусь в ситуации, когда я пытаюсь прочитать файл конфигурации JSON, который определяет, какие команды клавиш соответствуют заданным действиям. Например:

...
{ 
    "Action": "Quit",
    "Combo" : "CTRL+Q"
},
...

Построение QKeySequence из комбинированного тега тривиально, но мне нужно контролировать QKeyEvents для того, чтобы вызвать действия. Обратите внимание, что я должен контролировать QKeyEventпотому что они используются и для других целей в приложении. то есть было бы неприемлемо контролировать только ключевые команды для QKeySequences (если это вообще возможно).

Если не считать пользовательский синтаксический анализатор для создания QKeyEvent объект для каждого "Combo" тег, есть ли в любом случае сравнение QkeyEvent к QKeySequence? Например:

QKeyEvent KeyCommandsHandler::toKeyEvent(QKeySequence sequence) {
   //somehow convert to QKeyEvent
}

3 ответа

В общем, вы не можете сравнить QKeyEvent а также QKeySequence объекты. QKeyEvent представляет событие нажатия или отпускания одной клавиши, тогда как QKeySequence может содержать последовательность до четырех клавиш, каждая из которых содержит дополнительную информацию о модификаторе.

Однако вы можете сравнить объекты, если уверены, что последовательности клавиш всегда будут содержать только один ключ:

bool isEquiv(const QKeyEvent& event, const QKeySequence& seq)
{
    if (seq.count() != 1)
        return false;
    return seq[0] == (event.key() | event.modifiers());
}

Вы даже можете написать функцию преобразования для QKeyEvent в QKeySequence:

QKeySequence toKeySequence(const QKeyEvent& event)
{
    return QKeySequence(event.key() | event.modifiers());
}

Обратите внимание, что не имеет смысла конвертировать QKeySequence к QKeyEventтем не менее, поскольку вы должны выбрать конкретный тип события, такой как QEvent::KeyPress или же QEvent::KeyRelease,

Простое решение (написано на python):

key = QKeySequence(event.modifiers()|event.key()).toString()

Даст вам всю последовательность в виде строки, например, "Ctrl+Q".

Преимущества (по крайней мере, в Python) вы можете найти в кратких сочетаниях, в то время как QKeySequence не была бы хэшируемой.

Помните, что это предполагает, что вы используете правильный тип и интервал между типами. "Ctrl + Q" не будет совпадать. Чтобы избежать всех проблем, вы можете сделать следующее при первом прочтении ярлыков:

shortcut = shortcut.lower().remove(' ')

и сопоставить / найти с помощью

key = QKeySequence(event.modifiers()|event.key()).toString().lower()

или еще лучше:

shortcut = QKeySequence(shortcut).toString()

и соответствовать прямо.

Заметка Qt4.7 с кодом для преобразования KeyEvent в KeySequence. (Но код имеет недостатки, потому что он преобразует int для ключевого кода из QKeyEvent.key() в строку. Лучше использовать QKeyEvent.text()?)

Также код в ответе Фердинанда:

QKeySequence(event.key() | event.modifiers())

не является безопасным типом (смешивает int и QKeyboardModifiers) и если преобразование в Python завершается неудачно в PyQt, но не в PySide?

Кроме того, "QKeyEvent представляет событие нажатия или отпускания одной клавиши" на самом деле не объясняет этого. QKeyEvent может сказать вам, какая комбинация клавиш была выключена, но не порядок, в котором они были нажаты. Когда пользователь последовательно нажимает клавиши, ваше приложение может получить последовательность QKeyEvents (в зависимости от того, использует ли ваше приложение обработчики по умолчанию или переопределенные для QKeyEvent.) Более поздний QKeyEvents покажет вам все ключи, которые были недоступны во время события, Они могут больше не быть внизу. Это довольно сложно.

Другие вопросы по тегам