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

2023-12-23

我想将代表键盘上的键的字符串转换为键码枚举,例如Qt::Key http://doc.qt.digia.com/4.7/qt.html#Key-enum(或其他任何东西)。转换示例如下:

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

如您所见,上面不仅包括字母数字键,还包括修饰符和特殊键。我没有附加到 Qt 键码枚举,但 Qt 似乎有这个解析功能QKeySequence's fromString静态函数(参见这个直接链接 http://qt-project.org/doc/qt-4.8/qkeysequence.html#fromString):

QKeySequence fromString(const QString & str, SequenceFormat format);

您可能会理解为什么我需要这种转换。好吧,我有一个由以下代码生成的数据文件幽灵鼠标 http://www.ghost-mouse.com。这是我输入内容的日志。这是我打字的一个例子" 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不承认Ctrlkey 本身就是一个 key。因此,为了支持修饰键,您必须使用“+”符号拆分字符串表示形式,然后单独处理每个子字符串。完整的功能如下:

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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • CLR 2.0 与 4.0 性能比较?

    如果在 CLR 4 0 下运行 为 CLR 2 0 编译的 NET 程序会运行得更快吗 应用程序配置
  • 使用 C# 登录《我的世界》

    我正在尝试为自己和一些朋友创建一个简单的自定义 Minecraft 启动器 我不需要启动 Minecraft 的代码 只需要登录的实际代码行 例如 据我所知 您过去可以使用 string netResponse httpGET https
  • 以编程方式读取 SQL Server 查询计划建议的 SQL 特定执行的索引?

    如果我在 SSMS 中运行此命令 set showplan xml on GO exec some procedure arg1 arg2 arg3 GO set showplan xml off GO 我获得查询执行中涉及的完整调用堆栈的
  • 在c#中执行Redis控制台命令

    我需要从 Redis 控制台获取 客户端列表 输出以在我的 C 应用程序中使用 有没有办法使用 ConnectionMultiplexer 执行该命令 或者是否有内置方法可以查找该信息 CLIENT LIST是 服务器 命令 而不是 数据库
  • ComboBox DataBinding 导致 ArgumentException

    我的几个类对象 class Person public string Name get set public string Sex get set public int Age get set public override string
  • 查看 NuGet 包依赖关系层次结构

    有没有一种方法 文本或图形 来查看 NuGet 包之间的依赖关系层次结构 如果您使用的是新的 csproj 您可以在此处获取所有依赖项 在项目构建后 项目目录 obj project assets json
  • 使用可变参数包类型扩展的 C++ 函数调用者包装器

    我绑定了一些 API 并且绑定了一些函数签名 如下所示 static bool WrapperFunction JSContext cx unsigned argc JS Value vp 我尝试将对象和函数包装在 SpiderMonkey
  • 对 std::vector 进行排序但忽略某个数字

    我有一个std vector
  • Python 属性和 Swig

    我正在尝试使用 swig 为一些 C 代码创建 python 绑定 我似乎遇到了一个问题 试图从我拥有的一些访问器函数创建 python 属性 方法如下 class Player public void entity Entity enti
  • 识别 Visual Studio 中的重载运算符 (c++)

    有没有办法使用 Visual Studio 快速直观地识别 C 中的重载运算符 在我看来 C 中的一大问题是不知道您正在使用的运算符是否已重载 Visual Studio 或某些第三方工具中是否有某些功能可以自动突出显示重载运算符或对重载运
  • 在视口中查找 WPF 控件

    Updated 这可能是一个简单或复杂的问题 但在 wpf 中 我有一个列表框 我用一个填充数据模板从列表中 有没有办法找出特定的数据模板项位于视口中 即我已滚动到其位置并且可以查看 目前我连接到了 listbox ScrollChange
  • 在 NaN 情况下 to_string() 可以返回什么

    我使用 VS 2012 遇到了非常令人恼火的行为 有时我的浮点数是 NaN auto dbgHelp std to string myFloat dbgHelp最终包含5008角色 你不能发明这个东西 其中大部分为0 最终结果是 0 INF
  • 如何在 C 中安全地声明 16 位字符串文字?

    我知道已经有一个标准方法 前缀为L wchar t test literal L Test 问题是wchar t不保证是16位 但是对于我的项目 我需要16位wchar t 我还想避免通过的要求 fshort wchar 那么 C 不是 C
  • C++ int 前面加 0 会改变整个值

    我有一个非常奇怪的问题 如果我像这样声明一个 int int time 0110 然后将其显示到控制台返回的值为72 但是当我删除前面的 0 时int time 110 然后控制台显示110正如预期的那样 我想知道两件事 首先 为什么它在
  • 在屏幕上获取字符

    我浏览了 NCurses 函数列表 似乎找不到返回已打印在屏幕上的字符的函数 每个字符单元格中存储的字符是否有可访问的值 如果没有的话Windows终端有类似的功能吗 我想用它来替换屏幕上某个值的所有字符 例如 所有a s 具有不同的特征
  • 使 Guid 属性成为线程安全的

    我的一个类有一个 Guid 类型的属性 该属性可以由多个线程同时读写 我的印象是对 Guid 的读取和写入不是原子的 因此我应该锁定它们 我选择这样做 public Guid TestKey get lock testKeyLock ret
  • OpenGL:仅获取模板缓冲区而没有深度缓冲区?

    我想获取一个模板缓冲区 但如果可能的话 不要承受附加深度缓冲区的开销 因为我不会使用它 我发现的大多数资源表明 虽然模板缓冲区是可选的 例如 排除它以利于获得更高的深度缓冲区精度 但我还没有看到任何请求并成功获取仅 8 位模板缓冲区的代码
  • 是否可以在 Qt Creator 中将 Qt 样式表与升级的小部件一起使用?

    我正在尝试使用 Qt 样式表对标准小部件进行一些重大的重新设计 因此 在为不同的小部件手动完成大部分工作之后 objectName选择器 我决定以某种方式对类似的小部件进行分组 例如我有多个QFrames其作用类似于内部表单中的标题 我希望
  • 我可以在“字节数”设置为零的情况下调用 memcpy() 和 memmove() 吗?

    当我实际上没有什么可以移动 复制的时候 我是否需要处理这些情况memmove memcpy 作为边缘情况 int numberOfBytes if numberOfBytes 0 memmove dest source numberOfBy
  • 如何减少具有多个单元的 PdfPTable 的内存消耗

    我正在使用 ITextSharp 创建一个 PDF 它由单个 PdfTable 组成 不幸的是 对于特定的数据集 由于创建了大量 PdfPCell 我遇到了内存不足异常 我已经分析了内存使用情况 我有近百万个单元格的 1 2 在这种情况下有

随机推荐

  • 所有组合的 Matlab 循环

    我是 Matlab 新手 这似乎超出了我的能力范围 提前感谢您的帮助和感谢 基本上 我有一个带有列标题的多列数据集 列号可能因数据集而异 需要迭代列的所有组合 例如 A B A C B C B D 等 并运行公式 在本例中它是一个相关公式
  • DDD 基础设施服务

    我正在学习 DDD 但我对基础设施层有点迷失 据我了解 所有优秀的 DDD 应用程序 应该有 4 层 表示层 应用程序层 领域层和基础设施层 应使用存储库访问数据库 存储库接口应该位于域层和存储库实现中 位于基础设施中 参考DDD 在哪里保
  • 类类型非类型模板参数初始化不编译

    我的印象是 在新的 C 20 标准下 以下内容应该成为有效代码 struct Foo int a b template
  • Java 日志记录与 Log4J [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 是否仍然值得将 log4j 库添加到 Java 5 项目中只是为了记录日志 假设文件有一些例外 并有一些不错的翻转设置 或者标准的 util l
  • 使用 SQLite 获取本周的数据

    我试图在 sqlite 中获取本周的数据 但似乎我错过了一些东西 因为我得到了错误的信息 更具体地说 我想检索数据库中具有时间戳的所有数据 其日期属于本周 本周可能从周日或周一开始 即 26 2 12 03 03 12 目前我正在使用这样的
  • 即使有垂直滚动,如何将绝对定位的项目保留在网站底部?

    我有一个具有绝对位置的页脚 footer position absolute bottom 0 height 43px padding 0 background color 333333 width 100 color 737373 tex
  • Django 密码问题

    我正在为用户使用模型 如下所示 class UserForm forms ModelForm class Meta model User fields username password email 但密码字段显示为常规文本字段 而不是密码
  • 如何使用 OpenXml 2.0 将任何文件类型嵌入到 Microsoft Word 中

    我花了很多时间试图找到一种使用 OpenXml 2 0 将任何文件嵌入 Microsoft Word 的好方法 Office 文档相当简单 但其他文件类型 例如 PDF TXT GIF JPG HTML 等 又如何呢 在 C 中 让它适用于
  • 如何使用 Bouncy Castle 将私钥附加到证书

    我有两个 PEM 文件需要在 Bouncy Castle 中加载 一个文件是证书 另一个文件是私钥 使用本文答案中的代码 如何读取 Pem 证书和私钥文件并创建 Bouncy Castle X509Certificate 和 Bouncy
  • Python 中的重试函数 [重复]

    这个问题在这里已经有答案了 前段时间 我需要一个retryR 中的函数处理缓慢的服务器响应 该函数将具有以下行为 尝试一个操作 函数或方法 如果失败 请稍等一下 然后重试 x10 我想出了以下几点 retry lt function fun
  • Ant + 类路径问题

    我已经编写了一个 ANT 脚本 最后正在构建 jar 这是 jar 部分的建筑
  • 使用内联脚本时在 Python 中将 unicode 字符打印到控制台的正确方法

    我正在寻找一种使用 Python 2 x 将 unicode 字符打印到支持 UTF 8 的 Linux 控制台的方法print method 我得到的是 python2 7 c print u 我想要的是 python2 7 c prin
  • Ipython 笔记本 - 无法打开

    我尝试打开 ipython 笔记本但没有成功 不知道为什么 当我输入命令 ipython notebook 时 我收到的输出是 bash usr local bin ipython usr local opt python bin pyth
  • 图片框位图缩放

    我有一个Picturebox和一大堆Bitmaps可以在其中显示 位图与其他位图相比的相对大小对用户来说很重要 他们需要能够看出一张图像比另一张图像小或大 位图还必须完全适合图片框 并且图片框不能调整大小 当简单地在一个巨大的图片框中显示未
  • 将 d3.js SVG 代码转换为独立程序 - 有什么建议吗?

    我有一些用 d3 js 编写的脚本 可以生成 SVG 图表 我想使用独立程序生成这些图表 将这些脚本转换为在批处理模式下运行而不需要浏览器的最简单方法是什么 你可以 将其转换为node js http nodejs org程序 您可以访问文
  • 在 Excel-VBA 中使用 RegEx 替换文本

    我在 Excel 中有如下数据 此处一行 Excel 中的一个单元格 07 July 2015 12 02 14 July 2015 17 02 12 August 2015 22 02 01 September 2015 11 02 我想
  • jQuery 移动选项卡和锚点

    我想使用 jQuery Mobile 创建一个选项卡式移动页面 我已经掌握了创建选项卡 例如 Tab1 Tab2 Tab3 Tab4 以及让每个选项卡加载新内容页面的基础知识 我将如何在特定选项卡中使用锚点 例如 如果有人想要为一个链接添加
  • 如何使用 NodeJS 验证 Hmac?

    我可以使用以下代码通过 NodeJS 成功创建 Hmac 稍微改变示例 https nodejs org api crypto html cryptocreatehmacalgorithm key options https nodejs
  • 如何通过 ssh 连接到 docker 容器

    我正在运行容器hypriot rpi busybox httpd 我正在尝试 ssh 到 docker 容器 但出现以下错误 pi raspberrypi docker exec it cc55da85b915 bash rpc error
  • 将键码的字符串表示形式转换为 Qt::Key (或任何 int)并返回

    我想将代表键盘上的键的字符串转换为键码枚举 例如Qt Key http doc qt digia com 4 7 qt html Key enum 或其他任何东西 转换示例如下 Ctrl to Qt Key Control Up to Qt