Преобразовать строковое представление кода ключа в Qt :: Key (или любой int) и обратно

Я хотел бы преобразовать строку, представляющую клавишу на клавиатуре в перечисление кода клавиши, например Qt :: Key (или что-нибудь еще). Пример преобразования будет:

  • "Ctrl" в Qt::Key_Control
  • "Up" в Qt::Key_Up
  • "a" в Qt::Key_A
  • "5" в Qt::Key_5

Как вы видите, вышесказанное включает в себя не только буквенно-цифровые клавиши, но и модификаторы и специальные клавиши. Я не привязан к перечислению ключевого кода Qt, но похоже, что Qt имеет эту функцию синтаксического анализа в QKeySequence«s fromString статическая функция (см. это прямая ссылка):

QKeySequence fromString(const QString & str, SequenceFormat format);

Вы можете, как, почему мне нужно это преобразование. Ну, у меня есть файл данных, сгенерированный GhostMouse. Это журнал того, что я печатаю. Вот пример того, как я печатаю " It ":

{SPACE down}
{Delay 0.08}
{SPACE up}
{Delay 2.25}
{SHIFT down}
{Delay 0.11}
{i down}
{Delay 0.02}
{SHIFT up}
{Delay 0.03}
{i up}
{Delay 0.05}
{t down}
{Delay 0.08}
{t up}
{Delay 0.05}
{SPACE down}
{Delay 0.12}
{SPACE up}

Поэтому мне нужен способ преобразовать строку «ПРОБЕЛ» и все остальные строки, представляющие ключи в этом файле данных, в уникальный int,

5

Решение

Вы уже на правильном пути, глядя на QKeySequence, так как это может быть использовано для преобразования между кодами строки и ключа:

QKeySequence seq = QKeySequence("SPACE");
qDebug() << seq.count(); // 1

// If the sequence contained more than one key, you
// could loop over them. But there is only one here.
uint keyCode = seq[0];
bool isSpace = keyCode==Qt::Key_Space;
qDebug() << keyCode << isSpace;  // 32 true

QString keyStr = seq.toString().toUpper();
qDebug() << keyStr;  // "SPACE"

добавлено OP

Выше не поддерживает клавиши-модификаторы, такие как Ctrl, Alt, Shift и т. Д. К сожалению, QKeySequence не признает Ctrl ключ сам по себе как ключ. Таким образом, для поддержки клавиш-модификаторов вы можете добавить в последовательность немодифицирующий ключ, а затем вычесть его из кода. Ниже приведена полная функция:

uint toKey(QString const & str) {
QKeySequence seq(str);
uint keyCode;

// We should only working with a single key here
if(seq.count() == 1)
keyCode = seq[0];
else {
// Should be here only if a modifier key (e.g. Ctrl, Alt) is pressed.
assert(seq.count() == 0);

// Add a non-modifier key "A" to the picture because QKeySequence
// seems to need that to acknowledge the modifier. We know that A has
// a keyCode of 65 (or 0x41 in hex)
seq = QKeySequence(str + "+A");
assert(seq.count() == 1);
assert(seq[0] > 65);
keyCode = seq[0] - 65;
}

return keyCode;
}
6

Другие решения

Вы можете восстановить большинство кодов клавиш, например, QKeySequence::fromString("SPACE")[0] возвращает 32. Это не работает для Shift, Ctrl и т. д., поэтому вы должны обработать некоторые строки самостоятельно.

1

В одной строке попробуйте это:

qDebug() << QKeySequence(event->modifiers()+event->key()).toString() << '\n';

Сначала я вызываю конструктор QKeySequence, а затем преобразую его в строку, используя toString ().

Вывод (последним является ключ windows):

"Alt+??"
"Alt+A"
"Alt+A"
"Alt+A"
"A"
"S"
"F1"
"F2"
"Home"
"Ins"
"Num+8"
"Num+5"
"Num+4"
"Num+."
"Num++"
"Num+-"
"Num+/"
"Num+*"
"??"
1
По вопросам рекламы [email protected]