Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 从属于转发器的文本字段绑定文本_Qt_Qml - Fatal编程技术网

Qt 从属于转发器的文本字段绑定文本

Qt 从属于转发器的文本字段绑定文本,qt,qml,Qt,Qml,My main.qml: Window { visible: true width: 640 height: 480 color: "grey" GridLayout { anchors.fill: parent columns : 2 rows : 2 Repeater { id: rectRepeater

My 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
中的文本在开始处显示文本,但如果我在文本字段中输入新文本,矩形将不会更新。如何解决这个问题?

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

Component.onCompleted:
{
    t1.text = Qt.binding(function() { return rectRepeater.itemAt(0).text })
}
也就是说,我们需要确切地知道您正在尝试做什么,因为手动创建绑定在不需要时是一种反模式。直接绑定或使用信号要好得多

您是否需要第一个元件和中继器,或者这只是对您的测试?你的用户界面是什么?你想实现什么?这是一个值得给出正确答案的上下文

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

Repeater
{
    id: rectRepeater
    model: 3
    TextField
    {
        text: "hi"
        // See also `onEditingFinished` and `onValidated`
        onTextChanged: {
            if (index == 0)
                t1.text = 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 : ""
        }
    }
}
窗口{
可见:正确
宽度:640
身高:480
颜色:“灰色”
列表模型{
id:mymodel
}
Component.onCompleted:{
对于(VARI=0;I1?mymodel.get(0)。文本:“
}
}
}

谢谢,但稍后我有81个条目,因此模型列表将非常有用long@JohnSmith我正在考虑我的解决方案的缺点,看看我更新的解决方案:-)@JohnSmith 1。Qt建议不要进行直接绑定(
text:mymodel.count>1?mymodel.get(0)。text:
),因为它会保存使用Qt.binding的资源(
t1.text=Qt.binding(function(){return rectreater.itemAt(0.text})
)由于Qt当前正试图修复它,因此在某些级别上可能会失败。@JohnSmith多少字节占用更多数据?在一个可维护的应用程序中,通常会给它一个较轻的层,这样维护就很简单,只需花费几个字节,但作为交换,它可以帮助我们。如果您的想法是节省字节,而不是简化过程,那么您不应该使用Qt,而应该使用每个操作系统的本机代码,或者您认为为Qt添加的层是多平台的并且没有成本吗?在C++中,最小化是一种不好的做法。@JohnSmith,哪种变体更快?,因为很难知道,因为你的例子没有涵盖所有的可能性,平均而言,两者都很快,但对于你的“简单应用程序”,一个会在几微秒内更快,这被称为微型优化,在实际问题中没有任何优势,这就像说一种图像压缩算法比另一种算法更快,因为它只需要少一个字节。