QKeySequence в QKeyEvent

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

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

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

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

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

person Sonoman    schedule 30.04.2012    source источник
comment
Просто чтобы было ясно, использование QAction::setShortcut не будет делать то, что вы хотите?   -  person Anthony    schedule 30.04.2012


Ответы (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.

person Ferdinand Beyer    schedule 30.04.2012

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

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()

и совпадают напрямую.

person Jeff    schedule 18.12.2013

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

Кроме того, код в ответе Фердинанда:

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

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

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

person bootchk    schedule 12.09.2013