我遇到的情况是我试图读取JSON配置文件,该文件指示哪些键命令映射到给定的操作。例如:
...
{
"Action": "Quit",
"Combo" : "CTRL+Q"
},
...
从组合标记构造QKeySequence
是微不足道的,但我需要监视QKeyEvent
以触发操作。请注意我 监视QKeyEvent
,因为它们也用于应用程序中的其他用途。即仅监视QKeySequence
的关键命令是不可接受的(如果可能的话)。
如果没有编写自定义解析器来为每个QKeyEvent
标记构建"Combo"
对象,那么无论如何将QkeyEvent
与QKeySequence
进行比较?例如:
QKeyEvent KeyCommandsHandler::toKeyEvent(QKeySequence sequence) {
//somehow convert to QKeyEvent
}
答案 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)
通常,您无法比较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());
}
您甚至可以将QKeyEvent
的转化函数写入QKeySequence
:
QKeySequence toKeySequence(const QKeyEvent& event)
{
return QKeySequence(event.key() | event.modifiers());
}
请注意,将QKeySequence
转换为QKeyEvent
没有意义,因为您必须选择特定的事件类型,例如QEvent::KeyPress
或QEvent::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将显示事件发生时所有关闭的键。 。他们可能不再失败。这很复杂。