防止控件窃取键盘焦点

dte*_*ech 5 keyboard qt focus qml qtquick2

在 QML 中,只有单个对象可以拥有键盘焦点(每个窗口)。在我的应用程序中,我需要选择让多个对象具有键盘焦点,因此我将自定义事件调度程序与自定义多重选择实现结合使用。

然而问题是,每次单击任何库存控制元素时,它们都会自动窃取焦点,从而破坏自定义事件调度程序。

除此之外,在覆盖弹出窗口等情况下,仍然需要能够显式设置另一个焦点项目。

dte*_*ech 0

我最终得到了这个界面,应用于所有可聚焦的项目:

Item {
  onFocusChanged: if (keepFocus) focus = true
  property bool keepFocus: false
  property Item prevFocus: null
  function getFocus() {
    if (prevFocus) {
      prevFocus.keepFocus = false
      keepFocus = true
      focus = true
    }
  }
  function restoreFocus() {
    if (prevFocus) {
      keepFocus = false
      prevFocus.keepFocus = true
      prevFocus.focus = true
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

由于只有覆盖对话框才应该从事件调度程序获取焦点,因此对话框基本类型会自动处理分别在对话框显示和隐藏时获取和恢复焦点。

因此,我从“一个项目可能具有焦点”转向“一个项目可能具有显式焦点”,从而导致只要 Control 元素可能窃取该项目的焦点,就会为该项目重新启用焦点。