Я хотел бы преобразовать строку, представляющую клавишу на клавиатуре в перечисление кода клавиши, например 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
,
Вы уже на правильном пути, глядя на 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;
}
Вы можете восстановить большинство кодов клавиш, например, QKeySequence::fromString("SPACE")[0]
возвращает 32. Это не работает для Shift, Ctrl и т. д., поэтому вы должны обработать некоторые строки самостоятельно.
В одной строке попробуйте это:
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+*"
"??"