【问题标题】:How to remove active focus from QML Loader item?如何从 QML Loader 项目中删除活动焦点?
【发布时间】:2016-05-25 09:54:53
【问题描述】:

我有一个 UI,单击一个控件会选择它并取消选择当前选择的任何其他控件。在我将部分 UI 加载到加载器之前,它工作得很好。现在,如果我在加载器上选择了一个元素,同时选择了加载器之外的东西,焦点就会正确地从外部控件中移开,并交给加载器上的控件。但是重新选择外部控件并不会像应有的那样将焦点从加载器上的控件上移开。

我使用forceActiveFocus() 将焦点设置在应该在的位置。只有一个项目可以有活动焦点,所以当你在一个元素上调用 forceActiveFocus() 时,它会获得焦点,而任何有焦点的东西都会失去它。

我编写了一个小示例项目来展示这种行为。当它打开时,您会看到一个窗口分成两半;黄色的一半是加载器中的一个组件。没有选择任何内容。单击一侧会将焦点设置到该侧,无论是父项还是加载器中的项。

如果单击左半部分,则显示焦点。这完全符合预期。

如果您单击右半部分,它会显示焦点并从左半部分移除焦点,再次,这完全符合预期。

但是现在如果你点击暴露父Item的一侧,它会按预期获得焦点,但是Loader中的组件仍然显示它有焦点!

点击右半边会正确地强制聚焦并从左半边移开焦点,但是点击左半边时如何从右半边移开焦点?

此 Qt 5.6 代码将重现该行为:

import QtQuick 2.6
import QtQuick.Window 2.2

Window {
visible: true

Item {
    id: item
    anchors.fill: parent

    Text { text: 'Focused'; font.bold: true; visible: parent.activeFocus }
    MouseArea { anchors.fill: parent; onClicked: item.forceActiveFocus() }
    Text { text: 'Parent Item'; anchors.centerIn: parent }

    Loader {
        id: loader
        anchors {
            left: parent.horizontalCenter; right: parent.right
            top: parent.top; bottom: parent.bottom
        }
        sourceComponent: rect
        opacity: .8
    }
    Text { anchors.centerIn: loader; text: 'The\nLoader' }
}

Component {
    id: rect

    Rectangle {
        color: 'yellow'

        Text { text: 'Focused'; font.bold: true; visible: parent.activeFocus }
        MouseArea { anchors.fill: parent; onClicked: item.forceActiveFocus() }
    }
}
}

【问题讨论】:

    标签: qml


    【解决方案1】:

    使用activeFocus 属性而不是focus 属性来确定元素是否具有活动焦点。我不知道为什么focus 以前工作得这么好,但是用它来检测 主动焦点 是一种有缺陷的方法,注定会失败。

    【讨论】:

      猜你喜欢
      • 2017-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-20
      相关资源
      最近更新 更多