将keycode的字符串表示形式转换为Qt::Key(或任何int)并返回
Convert string representation of keycode to Qt::Key (or any int) and back
我想转换一个字符串表示键盘上的键到一个键码enum像Qt:: key(或任何其他)。示例转换如下:
-
"Ctrl"
到Qt::Key_Control
-
"Up"
到Qt::Key_Up
-
"a"
到Qt::Key_A
-
"5"
到Qt::Key_5
不仅包括alpha数字键,还包括修饰符和特殊键。我没有附加到Qt keycode enum,但似乎Qt在QKeySequence
的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}
所以我需要一种方法来转换字符串"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+*"
"??"
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 如何在不产生任何垃圾的情况下获得C中的像素
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- C++映射有2个键,这样任何1个键都可以用来获取值
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- RtlCaptureStackBackTrace未捕获任何帧
- 链表c++插入,所有情况都已检查,但没有任何工作
- C++模板函数,用于比较任何无符号整数和有符号整数
- Arduino millis() - millis() 怎么能等于 0 以外的任何东西?
- 尝试摆脱任何堆内存分配
- 是否有任何C++功能可以对地图进行排序?
- 打印时有二叉树问题.用户输入不打印任何内容
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 在C++行尾写一个分号或多个分号是否会改变任何内容
- C++类型特征,以查看是否可以<uint32_t>对类型"K"的任何变量调用"static_cast(k)"
- 如果 KEY 是 std::list 或 std::vector 而不是值,那么 std::map 的默认行为是什么?
- C++ 将 CIN 值存储到任何类型的数组中
- getch() 函数在输入 key 时不执行任何操作
- 将keycode的字符串表示形式转换为Qt::Key(或任何int)并返回