将键码的字符串表示形式转换为Qt :: Key(或任何int)并返回

问题描述 投票:7回答:3

我想将代表键盘上的键的字符串转换为键码枚举,例如Qt::Key(或其他任何东西)。转换示例如下:

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

如您所见,上面不仅包括字母数字键,还包括修饰符和特殊键。我没有加入Qt键码枚举,但是Qt似乎在QKeySequencefromString静态函数(请参阅this direct link)中具有此解析功能:

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}

因此,我需要一种方法来将字符串“ SPACE”和所有其他表示此数据文件中键的字符串转换为唯一的int

c++ qt type-conversion string-parsing keycode
3个回答
8
投票

您已经在正确的位置,看着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键是键。因此,要支持修饰键,您必须使用“ +”号分割字符串表示形式,然后分别处理每个子字符串。以下是完整的功能:

QVector<int> EmoKey::splitKeys(const QString &comb)
{
    QVector<int> keys;
    const auto keyList = comb.split('+');
    for (const auto &key: keyList) {
        if (0 == key.compare("Alt", Qt::CaseInsensitive)) {
            keys << Qt::Key_Alt;
        } else if (0 == key.compare("Ctrl", Qt::CaseInsensitive)) {
            keys << Qt::Key_Control;
        } else if (0 == key.compare("Shift", Qt::CaseInsensitive)) {
            keys << Qt::Key_Shift;
        } else if (0 == key.compare("Meta", Qt::CaseInsensitive)) {
            keys << Qt::Key_Meta;
        } else {
            const QKeySequence keySeq(key);
            if (1 == keySeq.count()) {
                keys << keySeq[0];
            }
        }
    }
    return keys;
}

1
投票

您可以恢复大多数键代码,例如,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+*"

"??"
© www.soinside.com 2019 - 2024. All rights reserved.