QKeySequence到QKeyEvent

Son*_*man 8 c++ qt key-events qkeysequence

我正处于这种情况,我试图读取一个JSON配置文件,该文件指示哪些键命令映射到给定的操作.例如:

...
{ 
    "Action": "Quit",
    "Combo" : "CTRL+Q"
},
...
Run Code Online (Sandbox Code Playgroud)

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

如果没有编写自定义解析器来QKeyEvent为每个"Combo"标记构造一个对象,那么无论如何要比较QkeyEvent一个QKeySequence?例如:

QKeyEvent KeyCommandsHandler::toKeyEvent(QKeySequence sequence) {
   //somehow convert to QKeyEvent
}
Run Code Online (Sandbox Code Playgroud)

Fer*_*yer 5

通常,您无法QKeyEventQKeySequence对象进行比较。 QKeyEvent表示的情况下,单个按键或释放,而QKeySequence可以包含的序列最多四个键,每个键具有可选的改性剂的信息。

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

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

你甚至可以写一个转换功能QKeyEventQKeySequence

QKeySequence toKeySequence(const QKeyEvent& event)
{
    return QKeySequence(event.key() | event.modifiers());
}
Run Code Online (Sandbox Code Playgroud)

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


Jef*_*eff 5

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

key = QKeySequence(event.modifiers()|event.key()).toString()
Run Code Online (Sandbox Code Playgroud)

将以字符串形式提供整个序列,例如"Ctrl + Q".

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

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

shortcut = shortcut.lower().remove(' ')
Run Code Online (Sandbox Code Playgroud)

并匹配/查找使用

key = QKeySequence(event.modifiers()|event.key()).toString().lower()
Run Code Online (Sandbox Code Playgroud)

或者更好的是:

shortcut = QKeySequence(shortcut).toString()
Run Code Online (Sandbox Code Playgroud)

并直接匹配.