QML:在Repeater上调用itemAt返回null

时间:2016-09-29 11:03:38

标签: 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 {
                    width: 30
                    height: 30
                    color: "red"
                    radius: 10
                }
            }
        }
        Row {
            Repeater {
                model: 3
                Text {
                    text: rectRepeater.itemAt(0).width;
                }
            }
        }
    }
}

我收到此错误消息:

  

TypeError:无法读取null

的属性'width'

我发现this post说解决方法就是像这样使用Component.onCompleted(只需在Text对象中插入一个Component.onCompleted处理程序):

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 {
                    Component.onCompleted: {
                        text: rectRepeater.itemAt(0).width;
                    }
                }
            }
        }
    }
}

但这失败并出现同样的错误。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

致电rectRepeater时,

itemAt(0)项不会退出。

在实例化itemAt时,您应该致电rectRepeater

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
            }
        }
    }
}

答案 1 :(得分:1)

我会选择条件绑定

Text {
    text: rectRepeater.count > 0 ? rectRepeater.itemAt(0).width : 0;
}

一旦rectRepeater实际创建了至少一个委托,就会读取该委托的值。 即使rectRepeater的模型在某个时刻再次变空或者索引0处的项目改变其宽度

也是如此