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

Convert string representation of keycode to Qt::Key (or any int) and back

本文关键字:Key 任何 int 返回 Qt 字符串 keycode 表示 转换      更新时间:2023-10-16

我想转换一个字符串表示键盘上的键到一个键码enum像Qt:: key(或任何其他)。示例转换如下:

  • "Ctrl"Qt::Key_Control
  • "Up"Qt::Key_Up
  • "a"Qt::Key_A
  • "5"Qt::Key_5
如您所见,上面的

不仅包括alpha数字键,还包括修饰符和特殊键。我没有附加到Qt keycode enum,但似乎Qt在QKeySequencefromString静态函数中具有此解析功能(参见此直接链接):

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"

上面不支持修改键,如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;
}

可以恢复大部分键码,如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+*"
"??"
相关文章: