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)
通常,您无法QKeyEvent与QKeySequence对象进行比较。 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)
你甚至可以写一个转换功能QKeyEvent来QKeySequence:
QKeySequence toKeySequence(const QKeyEvent& event)
{
return QKeySequence(event.key() | event.modifiers());
}
Run Code Online (Sandbox Code Playgroud)
请注意,将a转换QKeySequence为a 没有意义QKeyEvent,因为您必须选择特定的事件类型,例如QEvent::KeyPress或QEvent::KeyRelease。
一个简单的解决方案(用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)
并直接匹配.