强制关注ListView中的TextEdit

时间:2015-03-31 21:12:58

标签: listview focus qml qtquick2 textedit

请考虑以下示例。

Rectangle {
    height: 200
    width: 200
    ListView {
        id: lv
        anchors.fill: parent
        model: ListModel {
            ListElement {
                name: "aaa"
            }
            ListElement {
                name: "bbb"
            }
            ListElement {
                name: "ccc"
            }
        }
        delegate: TextEdit {
            id: delegate
            text: name
            width: 200
            height: 100
            activeFocusOnPress: false
            onActiveFocusChanged: {
                if(activeFocus) {
                    font.italic = true;
                } else {
                    font.italic = false;
                }
            }
            MouseArea {
                anchors.fill: parent
                onDoubleClicked : {
                    delegate.focus = true;
                    lv.currentIndex = index;
                }
            }
        }
    }
}

我希望能够通过双击激活TextEdit。如果它在列表视图之外,它按预期工作,但在列表视图中,它无法正常工作。 我想问题是列表视图是重点范围,但我不知道如何解决它。

提前致谢。

1 个答案:

答案 0 :(得分:1)

您可以利用forceActiveFocus

  

此方法将焦点设置在项目上,确保对象层次结构中的所有祖先FocusScope对象也被赋予焦点

您可以使用重载版本(不带参数)或带FocusReason的版本。以下是使用后者的代码的修改版本。我还做了两个小调整,并附有解释性评论:

import QtQuick 2.4
import QtQuick.Window 2.2

Window {
    visible: true
    width: 200
    height: 200

    ListView {
        anchors.fill: parent
        model: ListModel {
            ListElement {
                name: "aaa"
            }
            ListElement {
                name: "bbb"
            }
            ListElement {
                name: "ccc"
            }
        }
        delegate: TextEdit {
            text: name
            // In the delegate you can access the ListView via "ListView.view"
            width: ListView.view.width  
            height: 50
            activeFocusOnPress: false
            // directly bind the property to two properties (also saving the brackets)
            onActiveFocusChanged: font.italic = activeFocus

            MouseArea {
                anchors.fill: parent
                onDoubleClicked : {
                    parent.forceActiveFocus(Qt.MouseFocusReason)
                    parent.ListView.view.currentIndex = index
                }
            }
        }
    }
}