ListView 委托上的绑定循环

Binding loop on ListView delegate

我有这个代码,它给我这个错误:

file:///home/user/qmltests/bindingheight.qml:29:5: QML Pane: Binding loop detected for property "height"

为什么会产生循环?我该如何解决这个问题?

import QtQuick 2.11
import QtQuick.Controls 2.4
import QtQuick.Layouts 1.11


ListView {
            width: 300
            height: 600
            clip: true
            model: ListModel {
                id: fruitModel

                ListElement {
                    name: "Apple Apple Apple Apple Apple Apple Apple Apple Apple Apple Apple Apple"
                    cost: 2.45
                }
                ListElement {
                    name: "Orange Orange Orange Orange Orange Orange Orange Orange Orange Orange"
                    cost: 3.25
                }
                ListElement {
                    name: "Banana Banana Banana Banana Banana Banana Banana Banana Banana Banana"
                    cost: 1.95
                }
            }
            delegate: Item {
                width: 200
                height: childrenRect.height * 1.1
                Pane {
                    height: contentItem.childrenRect.height
                    anchors.left: parent.left
                    anchors.right: parent.right
                    anchors.bottomMargin: 20
                    padding: 10
                    background: Rectangle { anchors.fill: parent; color: "gray";}
                    MouseArea {
                        anchors.fill: parent
                        onClicked: {
                            console.log("Executing action on the item")
                        }   
                    }
                    ColumnLayout {
                        anchors.top: parent.top
                        anchors.left:parent.left
                        anchors.right: parent.right
                        Label {
                            id: item_to_hide
                            text: model.name
                            wrapMode: Label.WordWrap
                            Layout.maximumWidth: parent.width
                        }
                        Label {
                            text: model.cost
                        }
                        Button {
                            text: " Hide element "
                            onClicked: {
                                item_to_hide.visible=false
                            }
                        }
                        Button {
                            text: " Show element "
                            onClicked: {
                                item_to_hide.visible=true
                            }
                        }
                    }
                }
            }
}

这是 Qt 5.11,测试是用 qmlscene 完成的,只是 copy/paste 并提供给 bin/qmlscene 以重现错误。

使用 ID 来识别您的组件,而不是使用 children*/content* 属性。您和 QML 都将更容易理解您的代码。这对我有用:

import QtQuick 2.11
import QtQuick.Controls 2.4
import QtQuick.Layouts 1.11

ListView {
    width: 300
    height: 600
    clip: true
    model: ListModel {
        id: fruitModel

        ListElement {
            name: "Apple Apple Apple Apple Apple Apple Apple Apple Apple Apple Apple Apple"
            cost: 2.45
        }
        ListElement {
            name: "Orange Orange Orange Orange Orange Orange Orange Orange Orange Orange"
            cost: 3.25
        }
        ListElement {
            name: "Banana Banana Banana Banana Banana Banana Banana Banana Banana Banana"
            cost: 1.95
        }
    }
    delegate: Item {
        width: 200
        height: panneau.height * 1.1
        Pane {
            id: panneau
            height: clayout.height
            anchors.left: parent.left
            anchors.right: parent.right
            anchors.bottomMargin: 20
            padding: 10
            background: Rectangle {
                anchors.fill: parent
                color: "gray"
            }
            MouseArea {
                anchors.fill: parent
                onClicked: console.log("Executing action on the item")
            }
            ColumnLayout {
                id: clayout
                anchors.top: parent.top
                anchors.left: parent.left
                anchors.right: parent.right
                Label {
                    id: item_to_hide
                    text: model.name
                    wrapMode: Label.WordWrap
                    Layout.maximumWidth: parent.width
                }
                Label {
                    text: model.cost
                }
                Button {
                    text: " Hide element "
                    onClicked: item_to_hide.visible = false
                }
                Button {
                    text: " Show element "
                    onClicked: item_to_hide.visible = true
                }
            }
        }
    }
}

使用您编写的相同代码,只需将 Paneheight 更改为 implicitHeight。这将打破由 height.

创建的循环
Pane {
  implicitHeight: contentItem.childrenRect.height
  anchors.left: parent.left
  anchors.right: parent.right
  anchors.bottomMargin: 20
  padding: 10
  background: Rectangle { anchors.fill: parent; color: "gray";}
  MouseArea {
    anchors.fill: parent
    onClicked: {
      console.log("Executing action on the item")
    }   
  }

...