绑定属于重复器的TextField中的文本

时间:2019-03-23 18:17:40

标签: qt qml

我的main.qml:

Window 
{
    visible: true
    width: 640
    height: 480
    color: "grey"

    GridLayout
    {
        anchors.fill: parent
        columns : 2
        rows    : 2

        Repeater
        {
            id: rectRepeater
            model: 3
            TextField
            {
                text: "hi"
            }

        }
    }

    Rectangle
    {
        id: r1
        width: 100
        height: 100
        x: 200
        y: 200
        border.color: "red"
        Text
        {
            id: t1
        }
    }

    Component.onCompleted:
    {
        t1.text= rectRepeater.itemAt(0).text
    }
}

矩形r1中的文本在开头显示文本,但是如果我在TextField中输入新文本,则矩形不会更新。我该怎么解决?

2 个答案:

答案 0 :(得分:2)

一个更优雅,更可维护的解决方案是实现一个反映更改的模型,然后将第一个元素与显示Text的文本绑定在一起。

Window{
    visible: true
    width: 640
    height: 480
    color: "grey"
    ListModel{
        id: mymodel
    }
    Component.onCompleted: {
        for(var i=0; i<3; i++){
            mymodel.append({"text" : "hi"})
        }
    }
    GridLayout{
        anchors.fill: parent
        columns : 2
        rows    : 2
        Repeater{
            model: mymodel
            TextField{
                id: tf
                onTextChanged: model.text = tf.text
                Component.onCompleted: tf.text= model.text
            }
        }
    }
    Rectangle{
        id: r1
        width: 100
        height: 100
        x: 200
        y: 200
        border.color: "red"
        Text {
            id: t1
            text: mymodel.count > 1 ? mymodel.get(0).text : ""
        }
    }
}

答案 1 :(得分:1)

您想要的是在两者之间创建绑定。

Component.onCompleted:
{
    t1.text = Qt.binding(function() { return rectRepeater.itemAt(0).text })
}

话虽如此,我们将需要确切地知道您要做什么,因为在不需要时手动创建绑定是一种反模式。直接绑定或使用信号要好得多。

您是否需要第一个元素和中继器,或者这只是对您的测试?您的UI是什么,您想达到什么目的?这是值得适当回答的一些背景。

一种可能更简单的解决方案

Repeater
{
    id: rectRepeater
    model: 3
    TextField
    {
        text: "hi"
        // See also `onEditingFinished` and `onValidated`
        onTextChanged: {
            if (index == 0)
                t1.text = text
        }
    }
}

有关财产的更多详细信息,请查看我对另一个问题的回答:Qml Repeater with ids