无法在QML TabView中将activeFocus设置为Item

时间:2015-12-22 07:08:28

标签: qml tabview

当用户更改我的TabView中的当前选项卡时。我想将activeFocus设置为当前标签中的顶级项目,例如使用forceActiveFocus。然而,由于一些奇怪的原因,TabView将activeFocus设置为它在Tab中找到的第一个Button,即使该Button具有“focus:false”设置。 如下面的输出所示。当我使用forceActiveFocus将焦点设置为顶级项目时。首先,Item获得焦点,然后它会立即失去焦点而Button会获得焦点。如果选项卡中没有Button,则它按预期工作。我需要就解决这个问题的方法提出建议。我想知道这是一个Bug还是我在这里做错了什么?

以下是用户点击第二个标签页时的程序输出。

qml: Item Focus gained: Tab2
qml: Button focus gained: Tab2
qml: Item Focus lost: Tab2

代码示例如下(在Qt 5.4.2中测试):

import QtQuick 2.4
import QtQuick.Controls 1.3
import QtQuick.Window 2.2
import QtQuick.Dialogs 1.2

ApplicationWindow {
    width: 640
    height: 480
    visible: true

    TabView {
        id: tabView

        onCurrentIndexChanged: {
            getTab(currentIndex).forceActiveFocus();
        }
    }

    Component.onCompleted: {
        var tab1 = tabView.addTab("tab1", tabComp);
        tab1.active = true;
        tab1.item.objectName = "Tab1";

        var tab2 = tabView.addTab("tab2", tabComp);
        tab2.active = true;
        tab2.item.objectName = "Tab2";
    }

    Component {
        id: tabComp
        Item {
            focus: true
            onActiveFocusChanged: {
                if(activeFocus)
                    console.log("Item Focus gained: " + objectName);
                else
                    console.log("Item Focus lost: " + objectName);
            }

            Button {
                focus: false
                onActiveFocusChanged: {
                    if(activeFocus)
                        console.log("Button focus gained: " + parent.objectName);
                    else
                        console.log("Button focus lost: " + parent.objectName);
                }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

单击选项卡时,TabView会将activeFocus设置为设置了activeFocusOnTab的第一个项目。默认情况下,Button将此设置为true。我通过将Button的activeFocusOnTab设置为false来解决这个问题。这与QML中的常规焦点管理有点不一致,因为我认为“焦点”属性通常优先于“activeFocusOnTab”用于初始焦点,但在这种情况下它被忽略。