【问题标题】:QKeySequence to QKeyEventQKeySequence 到 QKeyEvent
【发布时间】:2012-05-10 03:17:20
【问题描述】:

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

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

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

没有编写一个自定义解析器来为每个"Combo" 标记构造一个QKeyEvent 对象,是否可以将QkeyEventQKeySequence 进行比较?例如:

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

【问题讨论】:

  • 明确一点,使用 QAction::setShortcut 不会做你想做的事?

标签: c++ qt key-events qkeysequence


【解决方案1】:

一个简单的解决方案(用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()

直接匹配。

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      你甚至可以写一个QKeyEventQKeySequence的转换函数:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-19
        • 1970-01-01
        • 2015-03-09
        • 2021-09-07
        • 1970-01-01
        • 1970-01-01
        • 2019-08-07
        • 1970-01-01
        相关资源
        最近更新 更多