QKeySequence to QKeyEvent
Я нахожусь в ситуации, когда я пытаюсь прочитать файл конфигурации JSON, который определяет, какие команды клавиш соответствуют заданным действиям. Например:
...
{
"Action": "Quit",
"Combo" : "CTRL+Q"
},
...
Построение QKeySequence
из комбинированного тега тривиально, но мне нужно контролировать QKeyEvent
s для того, чтобы вызвать действия. Обратите внимание, что я должен контролировать QKeyEvent
потому что они используются и для других целей в приложении. то есть было бы неприемлемо контролировать только ключевые команды для QKeySequence
s (если это вообще возможно).
Если не считать пользовательский синтаксический анализатор для создания 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 покажет вам все ключи, которые были недоступны во время события, Они могут больше не быть внизу. Это довольно сложно.