防止控件窃取键盘焦点

时间:2017-04-23 07:38:44

标签: qt keyboard focus qml qtquick2

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

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

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

2 个答案:

答案 0 :(得分:1)

我不确定它是如何适应您的自定义事件的,但这个答案也可以帮助那些找到您的问题,但只是想阻止控件获得焦点的人。

您可以使用focusPolicy enum

阻止控件获得焦点
Button {
    focusPolicy: Qt.NoFocus
    // Other options:
    // focusPolicy: Qt.TabFocus - The control accepts focus by tabbing.
    // focusPolicy: Qt.ClickFocus - The control accepts focus by clicking.
    // focusPolicy: Qt.StrongFocus - The control accepts focus by both tabbing and clicking.
    // focusPolicy: Qt.WheelFocus - The control accepts focus by tabbing, clicking, and using the mouse wheel.
}

答案 1 :(得分: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
    }
  }
}

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

因此,从“一个项目可能有焦点”我移动到“一个项目可能有明确的焦点”,导致每当一个控制元素可能会窃取它时,重新启用该项目的焦点。