我想将代表键盘上的键的字符串转换为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

    最佳答案

    您已经在正确地查看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;
    }
    

    10-07 16:29
    查看更多