我的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中输入新文本,则矩形不会更新。我该怎么解决?
答案 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