QKeySequence到QKeyEvent

时间:2012-04-30 12:05:51

标签: c++ qt key-events qkeysequence

我遇到的情况是我试图读取JSON配置文件,该文件指示哪些键命令映射到给定的操作。例如:

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

从组合标记构造QKeySequence是微不足道的,但我需要监视QKeyEvent以触发操作。请注意我 监视QKeyEvent,因为它们也用于应用程序中的其他用途。即仅监视QKeySequence的关键命令是不可接受的(如果可能的话)。

如果没有编写自定义解析器来为每个QKeyEvent标记构建"Combo"对象,那么无论如何将QkeyEventQKeySequence进行比较?例如:

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

3 个答案:

答案 0 :(得分:5)

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

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

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

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

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

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

并使用

匹配/查找
key = QKeySequence(event.modifiers()|event.key()).toString().lower()

或更好:

shortcut = QKeySequence(shortcut).toString()

并直接匹配。

答案 1 :(得分:4)

通常,您无法比较QKeyEventQKeySequence个对象。 QKeyEvent表示键按下或释放的事件,而QKeySequence可以包含一系列最多四个键,每个键都可选修饰语信息。

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

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

您甚至可以将QKeyEvent的转化函数写入QKeySequence

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

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

答案 2 :(得分:0)

A Qt4.7 note with code for converting KeyEvent to KeySequence.(但代码有缺陷,因为它将来自QKeyEvent.key()的键码的int转换为字符串。最好使用QKeyEvent.text()?)

此外,Ferdinand的答案中的代码:

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

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

此外,“QKeyEvent代表单键按下或释放的事件”并没有真正解释它。 QKeyEvent可以告诉你键的组合是什么,而不是它们被按下的顺序。当用户按顺序按键时,您的应用程序可能会获得一系列QKeyEvents(取决于您的应用程序是否使用默认与QKeyEvent的重写处理程序。)后来的QKeyEvents将显示事件发生时所有关闭的键。 。他们可能不再失败。这很复杂。