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

标签 c++ qt type-conversion string-parsing keycode

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

  • “Ctrl”Qt::Key_Control
  • “向上”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;
}

关于c++ - 将键码的字符串表示形式转换为 Qt::Key(或任何 int)并返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14034209/

相关文章:

c++ - Boost::Spirit mini_c 教程

c++ - 将结构成员传递给函数

c++ - 好友功能无法识别

c# - 串行通信不通过 QSerialPort (Qt) 工作,但通过终端 (Termite) 工作

c - "int k = ((int)i)"有什么作用?

c++ - 奇怪的 C++ 内存分配

qt - 如何在带有opencv-cv::Scalar的QT-QColor之间转换?

qt - 使 QLabel 的像素图透明

java - 将 String 拆分并转换为 int

c++ - 为什么无符号短(乘)无符号短转换为有符号整数?