2017-04-23 124 views
1

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

然而,问题是每次点击任何股票的控制元素时,他们会自动窃取焦点,打破自定义事件分派器。

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

回答

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 
    } 
    } 
} 

由于只覆盖对话框都应该采取焦点从事件调度,对话基本类型自动处理的获取和恢复侧重于对话显示和隐藏。

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

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. 
} 
+0

这也可以做的伎俩,但它增加了必须手动添加到每个控制元件的不便。使其成为不太可取的选项,除非可以覆盖全局默认设置。它可以? – dtech

+0

啊,对...不,我没有意识到。不过,我认为不可能添加这样的功能。如果我没有记错的话,有一个类似的悬停支持环境变量。 – Mitch