如何从QML Loader项目中删除活动焦点?

时间:2016-05-24 17:08:04

标签: qml

我有一个UI,点击一个控件选择它并取消选择当前选中的任何其他控件。它工作得很好,直到我将部分UI加载到Loader中。现在,如果我选择加载器上的元素而选择了加载器之外的东西,则焦点将从外部控件中正确地取出并提供给Loader上的控件。但是重新选择外部控件不会像对应的那样把注意力从加载器上的控件上移开。

我使用forceActiveFocus()将焦点设置在应有的位置。只有一个项目可以具有主动焦点,因此当您在元素上调用forceActiveFocus()时,它会获得焦点以及焦点丢失的任何内容。

我写了一个显示此行为的小示例项目。当它打开时,你会看到Windows分成两半;黄色的一半是Loader中的一个组件。没有选择任何东西。单击一侧将焦点设置到该侧,即父项或装载程序中的项。

No focus on startup

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

Click left half and it receives focus

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

Click right half and it receives focus

但现在如果你单击公开的父项目侧,它会按预期获得焦点,但是装载程序中的组件仍然显示它具有焦点!

Click left half and it is focused, but right half remains focused too!

点击右半部分将正确强制对焦并从左半部分移除焦点,但如何在点击左半部分时从右半部分移除焦点?

此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() }
    }
}
}




1 个答案:

答案 0 :(得分:0)

使用activeFocus属性代替focus属性来确定元素是否具有有效焦点。我不确定为什么focus之前工作得那么好,但是使用它来检测主动关注是一种有缺陷的方法,注定要失败。