簡體   English   中英

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完成的,只需復制/粘貼並輸入到bin / qmlscene中即可重現錯誤。

使用相同的代碼,你寫的只是改變heightPaneimplicitHeight 這將打破由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")
    }   
  }

...

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM