如何在QML中制作可滑动的TextField?

时间:2018-02-02 11:16:51

标签: ios qml textfield swipe qtquickcontrols2

以下是我所拥有的:ListView和TextField中的SwipeDelegate,用于填充此委托。当我尝试滑动委托时,TextField会获得焦点,而我却无法做到。 这就是我需要的:当我尝试滑动TextField并仅在我点击它时传递焦点时滑动TextField。我需要的一个例子是"提醒"中的注释行为。 iOS上的应用程序。是否有可能以某种方式改变这种结构的行为,使其对我需要的滑动作出反应? 简化代码:

import QtQuick 2.9
import QtQuick.Controls 2.3
import QtQuick.Window 2.3

Window {
    id: root
    width: 320
    height: 480
    visible: true

    ListModel {
        id: simpleModel

        ListElement {
            text: "some text"
        }

        ListElement {
            text: "another text"
        }
    }

    ListView {
        id: simpleView
        model: simpleModel
        anchors.fill: parent

        delegate: SwipeDelegate {
            width: parent.width
            contentItem: TextField {
                text: model.text
                onAccepted: model.text = text
            }
            swipe.right: Label {
                id: deleteLabel
                text: "Delete"
                color: "white"
                verticalAlignment: Label.AlignVCenter
                padding: 12
                height: parent.height
                anchors.right: parent.right

                SwipeDelegate.onClicked: simpleView.model.remove(index);

                background: Rectangle {
                    color: "tomato"
                }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我要建议的是:

readOnly: true

然后对SwipeDelegate本身的点击做出反应以启用编辑器:

onClicked: {
    if (!swipe.complete) {
        contentItem.visible = true
        contentItem.forceActiveFocus()
    }
}

虽然这不起作用,因为TextField似乎消耗鼠标事件,即使它是只读的。我不确定这是不是一个错误;它可能会阻止鼠标事件进入其下方的项目。

无论如何,您可以隐藏TextField以防止它干扰鼠标事件,并在其位置显示一些文字:

import QtQuick 2.9
import QtQuick.Controls 2.3
import QtQuick.Window 2.3

Window {
    id: root
    width: 320
    height: 480
    visible: true

    ListModel {
        id: simpleModel

        ListElement {
            text: "some text"
        }

        ListElement {
            text: "another text"
        }
    }

    ListView {
        id: simpleView
        model: simpleModel
        anchors.fill: parent

        delegate: SwipeDelegate {
            id: swipeDelegate
            width: parent.width
            text: model.text

            onClicked: {
                if (!swipe.complete) {
                    contentItem.visible = true
                    contentItem.forceActiveFocus()
                }
            }

            Text {
                anchors.fill: contentItem
                anchors.leftMargin: contentItem.leftPadding
                verticalAlignment: Text.AlignVCenter
                text: model.text
                visible: !contentItem.visible
            }

            contentItem: TextField {
                text: model.text
                visible: false
                onAccepted: model.text = text
            }
            swipe.right: Label {
                id: deleteLabel
                text: "Delete"
                color: "white"
                verticalAlignment: Label.AlignVCenter
                padding: 12
                height: parent.height
                anchors.right: parent.right

                SwipeDelegate.onClicked: simpleView.model.remove(index);

                background: Rectangle {
                    color: "tomato"
                }
            }
        }
    }
}

我不知道iOS接受/取消输入的功能,但我相信你可以把这部分搞清楚。回应该事件并隐藏TextField,它应该都可以正常工作。