Qt QML:在中继器上调用itemAt返回null

Qt QML:在中继器上调用itemAt返回null,qt,qml,repeater,Qt,Qml,Repeater,我的代码: import QtQuick 2.7 import QtQuick.Window 2.2 Window { visible: true width: 640 height: 480 Column { Row { Repeater { id: rectRepeater model: 3 Rectangle {

我的代码:

import QtQuick 2.7
import QtQuick.Window 2.2

Window {
    visible: true
    width: 640
    height: 480

    Column {
        Row {
            Repeater {
                id: rectRepeater
                model: 3
                Rectangle {
                    width: 30
                    height: 30
                    color: "red"
                    radius: 10
                }
            }
        }
        Row {
            Repeater {
                model: 3
                Text {
                    text: rectRepeater.itemAt(0).width;
                }
            }
        }
    }
}
我收到以下错误消息:

TypeError:无法读取null的属性“宽度”

我发现解决方案是这样使用
Component.onCompleted
(只需在文本对象中插入
Component.onCompleted
处理程序):

但这失败了,并且出现了同样的错误


有什么想法吗?

rectreater
当您调用
itemAt(0)
时,items不会退出

当实例化
rectreater
时,应该调用
itemAt

Window {
    visible: true
    width: 640
    height: 480
    Column {
        Row {
            Repeater {
                id: rectRepeater
                model: 3
                Rectangle {
                    width: 30
                    height: 30
                    color: "red"
                    radius: 10
                }

            }
        }
        Row {
            Repeater {
                id: textrep
                model: 3
                Text {
                    }
            }
        }
        Component.onCompleted: {
            //Here all object are instantiated
            for (var i = 0; i< textrep.count; i++){
                textrep.itemAt(i).text = rectRepeater.itemAt(0).width
            }
        }
    }
}
窗口{
可见:正确
宽度:640
身高:480
纵队{
划船{
中继器{
id:直读中继器
型号:3
长方形{
宽度:30
身高:30
颜色:“红色”
半径:10
}
}
}
划船{
中继器{
id:textrep
型号:3
正文{
}
}
}
Component.onCompleted:{
//这里所有对象都是实例化的
对于(变量i=0;i
我会选择条件绑定

Text {
    text: rectRepeater.count > 0 ? rectRepeater.itemAt(0).width : 0;
}
一旦rectRepeater实际创建了至少一个委托,就会读取该委托的值。
即使rectRepeater的模型在某个点再次变为空,或者如果索引0处的项目更改了其宽度,这也可以工作

谢谢,这是可行的。因此,关键是等待
完成。但我自己的代码也在等待那个信号!(请参阅我问题中的第二个代码片段。)那么有什么区别呢?在您的代码中,
onCompleted
信号仅适用于
Text
组件。因此,当文本组件被实例化时,它就被激活了。在我的代码中,
onCompleted
应用于
组件,当列组件和所有他自己的孩子被实例化时它就会出现。酷,谢谢!在某些方面,这比未完成的
解决方案更优雅。你写了一些原因,而且它让我在它影响的元素中有了绑定代码,这非常好。缺点是它有点冗长(特别是绑定不支持多语句绑定函数),并且很难理解它的用途,因此需要注释。但总而言之,这是我将使用的解决方案。请注意,Konstantin T.的答案还允许对宽度进行动态绑定,通过分配
Qt.binding(…)
expression.Hm,我刚刚测试了多语句绑定函数,结果证明它们是有效的!这使您的解决方案更具吸引力。推测,未验证:这可能会导致文本设置3次(在本例中),因为中继器计数从0增加到3。在这里,它基本上是不相关的,但在其他一些情况下,它可能足够重要。当计数更改时,绑定表达式将再次求值,但text属性的setter将意识到没有更改,因此,对于可视化或任何使用该文本属性作为其输入之一的绑定,没有不必要的更新请求。不确定多语句绑定的含义,但绑定表达式基本上是一个函数,可能非常复杂(这不一定是一个好主意)。您还可以在rectreater中定义一个函数来执行此操作,并将该函数用作绑定表达式:
text:rectreater.firstRectWidth()
Text {
    text: rectRepeater.count > 0 ? rectRepeater.itemAt(0).width : 0;
}