Цикл привязки к делегату ListView

У меня есть этот код, который дает мне эту ошибку:

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, просто скопируйте / вставьте и загрузите в bin / qmlscene, чтобы воспроизвести ошибку.


person Nulik    schedule 08.03.2019    source источник
comment
Что ты пытался здесь сделать? Вы устанавливаете высоту, зависящую от размера детей, а затем привязываете ребенка к родительскому размеру. Думаю, ваш код нужно упростить.   -  person folibis    schedule 09.03.2019
comment
@folibis, просто пытаясь создать расширяемые элементы внутри ListView, вы нажимаете на него, и он расширяется, чтобы увидеть больше данных. Вот что я делаю.   -  person Nulik    schedule 09.03.2019
comment
сделать корневой элемент расширяемым и привязать к нему все дочерние элементы   -  person folibis    schedule 09.03.2019
comment
Вот пример из Qt.   -  person folibis    schedule 09.03.2019
comment
@folibis хорошие примеры, спасибо!   -  person Nulik    schedule 10.03.2019


Ответы (2)


Используя тот же код, который вы написали, просто измените height из Pane на 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")
    }   
  }

...

person bardao    schedule 12.03.2019
comment
Установка неявного размера полезна для определения компонентов, которые имеют предпочтительный размер в зависимости от их содержимого ... from doc.qt.io/qt-5/qml-qtquick-item.html#implicitHeight-prop - person bardao; 13.03.2019

Используйте идентификаторы для идентификации компонентов вместо использования свойств _1 _ / _ 2_. Ваш код будет легче понять вам и 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
                }
            }
        }
    }
}
person air-dex    schedule 12.03.2019