11

我正在尝试读取 JSON 配置文件,该文件指示哪些键命令映射到给定的操作。例如:

...
{ 
    "Action": "Quit",
    "Combo" : "CTRL+Q"
},
...

从组合标签构造 aQKeySequence是微不足道的,但我需要监视QKeyEvents 以触发操作。请注意,我必须监视QKeyEvents,因为它们在应用程序中也用于其他目的。即只监视QKeySequences 的关键命令是不可接受的(如果可能的话)。

没有编写自定义解析器来QKeyEvent为每个"Combo"标签构造一个对象,是否有将 aQkeyEvent与 a进行比较的方法QKeySequence?例如:

QKeyEvent KeyCommandsHandler::toKeyEvent(QKeySequence sequence) {
   //somehow convert to QKeyEvent
}
4

3 回答 3

7

一般来说,你不能比较QKeyEventQKeySequence对象。 QKeyEvent表示单个键按下或释放的事件,而 aQKeySequence可以包含最多四个键的序列,每个键都有可选的修饰符信息。

但是,如果您确定您的键序列将始终只包含一个键,则可以比较对象:

bool isEquiv(const QKeyEvent& event, const QKeySequence& seq)
{
    if (seq.count() != 1)
        return false;
    return seq[0] == (event.key() | event.modifiers());
}

您甚至可以为QKeyEventto编写转换函数QKeySequence

QKeySequence toKeySequence(const QKeyEvent& event)
{
    return QKeySequence(event.key() | event.modifiers());
}

QKeySequence请注意,将 a 转换为 a是没有意义的QKeyEvent,因为您必须选择特定的事件类型,例如QEvent::KeyPressor QEvent::KeyRelease

于 2012-04-30T15:34:00.763 回答
6

一个简单的解决方案(用python编写):

key = QKeySequence(event.modifiers()|event.key()).toString()

将以字符串形式为您提供整个序列,例如“Ctrl+Q”。

好处是(至少在 python 中)你可以在快捷方式的字典中找到,而 QKeySequence 不会是可散列的。

请注意,这需要您使用正确的类型和间距。“ctrl +Q”将不匹配。为避免所有问题,您可以在第一次阅读快捷方式时执行以下操作:

shortcut = shortcut.lower().remove(' ')

并匹配/查找使用

key = QKeySequence(event.modifiers()|event.key()).toString().lower()

或者更好:

shortcut = QKeySequence(shortcut).toString()

并直接匹配。

于 2013-12-18T11:09:49.100 回答
0

Qt4.7 注释,其中包含将 KeyEvent 转换为 KeySequence 的代码。 (但是代码有缺陷,因为它将键码的 int 从 QKeyEvent.key() 转换为字符串。最好使用 QKeyEvent.text() ?)

另外,费迪南德回答中的代码:

QKeySequence(event.key() | event.modifiers())

不是类型安全的(混合了 int 和 QKeyboardModifiers),如果转换为 Python 在 PyQt 中失败,但在 PySide 中失败?

此外,“QKeyEvent 表示单个按键按下或释放的事件”并没有真正解释它。QKeyEvent 可以告诉您按下的键组合,而不是按下它们的顺序。当用户按顺序按键时,您的应用程序可能会获得一系列 QKeyEvents(取决于您的应用程序是使用 QKeyEvent 的默认处理程序还是覆盖的处理程序。)稍后的 QKeyEvents 将显示事件发生时所有按下的键. 他们可能不再沮丧了。这是相当复杂的。

于 2013-09-12T14:51:21.697 回答