Uploaded image for project: 'Qt'
  1. Qt
  2. QTBUG-50606

ListView.PullBackHeader or OverlayHeader lead to program hang

    XMLWordPrintable

Details

    • Bug
    • Resolution: Duplicate
    • Not Evaluated
    • 5.6.0
    • 5.5.1
    • Quick: Controls 1
    • None
    • 1) OpenSUSE 42.1 x64
      KDE Frameworks 5.16.0
      QT 5.5.1
      2) Android 5.1.1 armv7a

    Description

      Setting headerPositioning in ListView to PullBackHeader or OverlayHeader leading to program hang when deleting elements. Bug happened on Linux PC and mobile Android.

      Tested with Qt example VIews/dynamicList(little modified it so it would be easy to multi-delete elements with mouse, added simple header element and set headerPositioning to PullBackHeader).

      dynamiclist.qml
      import QtQuick 2.5
      import "content"
      
      // This example shows how items can be dynamically added to and removed from
      // a ListModel, and how these list modifications can be animated.
      
      Rectangle {
          id: container
          width: 500; height: 400
          color: "#343434"
      
          // The model:
          ListModel {
              id: fruitModel
      
              ListElement {
                  name: "Apple"; cost: 2.45
                  attributes: [
                      ListElement { description: "Core" },
                      ListElement { description: "Deciduous" }
                  ]
              }
              ListElement {
                  name: "Banana"; cost: 1.95
                  attributes: [
                      ListElement { description: "Tropical" },
                      ListElement { description: "Seedless" }
                  ]
              }
              ListElement {
                  name: "Cumquat"; cost: 3.25
                  attributes: [
                      ListElement { description: "Citrus" }
                  ]
              }
              ListElement {
                  name: "Durian"; cost: 9.95
                  attributes: [
                      ListElement { description: "Tropical" },
                      ListElement { description: "Smelly" }
                  ]
              }
          }
      
          // The delegate for each fruit in the model:
          Component {
              id: listDelegate
      //! [0]
              Item {
      //! [0]
                  id: delegateItem
                  width: listView.width; height: 80
                  clip: true
      
                  /*Column {
                      id: arrows
                      anchors {
                          left: parent.left
                          verticalCenter: parent.verticalCenter
                      }
                      Image {
                          source: "content/pics/arrow-up.png"
                          MouseArea { anchors.fill: parent; onClicked: fruitModel.move(index, index-1, 1) }
                      }
                      Image { source: "content/pics/arrow-down.png"
                          MouseArea { anchors.fill: parent; onClicked: fruitModel.move(index, index+1, 1) }
                      }
                  }
      
                  Column {
                      anchors {
                          left: arrows.right
                          horizontalCenter: parent.horizontalCenter;
                          bottom: parent.verticalCenter
                      }
      
                      Text {
                          anchors.horizontalCenter: parent.horizontalCenter
                          text: name
                          font.pixelSize: 15
                          color: "white"
                      }
                      Row {
                          anchors.horizontalCenter: parent.horizontalCenter
                          spacing: 5
                          Repeater {
                              model: attributes
                              Text { text: description; color: "White" }
                          }
                      }
                  }
      
                  Item {
                      anchors {
                          left: arrows.right
                          horizontalCenter: parent.horizontalCenter;
                          top: parent.verticalCenter
                          bottom: parent.bottom
                      }
      
                      */Row {
                          anchors.centerIn: parent
                          spacing: 10
                          height: parent.height//20
      
                          PressAndHoldButton {
                              anchors.verticalCenter: parent.verticalCenter
                              height: parent.height
                              width: height
                              source: "content/pics/plus-sign.png"
                              onClicked: fruitModel.setProperty(index, "cost", cost + 0.25)
                          }
      
                          Text {
                              id: costText
                              anchors.verticalCenter: parent.verticalCenter
                              height: parent.height
                              text: '$' + Number(cost).toFixed(2)
                              font.pixelSize: 15
                              color: "white"
                              font.bold: true
                          }
      
                          PressAndHoldButton {
                              anchors.verticalCenter: parent.verticalCenter
                              height: parent.height
                              width: height
                              source: "content/pics/minus-sign.png"
                              onClicked: fruitModel.setProperty(index, "cost", Math.max(0,cost-0.25))
                          }
      
                          Image {
                              source: "content/pics/list-delete.png"
                              height: parent.height
                              width: height
                              MouseArea { anchors.fill:parent; onClicked: fruitModel.remove(index) }
                          }
                      }
                  /*}*/
      
                  // Animate adding and removing of items:
      //! [1]
                  ListView.onAdd: SequentialAnimation {
                      PropertyAction { target: delegateItem; property: "height"; value: 0 }
                      NumberAnimation { target: delegateItem; property: "height"; to: 80; duration: 250; easing.type: Easing.InOutQuad }
                  }
      
                  ListView.onRemove: SequentialAnimation {
                      PropertyAction { target: delegateItem; property: "ListView.delayRemove"; value: true }
                      NumberAnimation { target: delegateItem; property: "height"; to: 0; duration: 1000; easing.type: Easing.InOutQuad }
      
                      // Make sure delayRemove is set back to false so that the item can be destroyed
                      PropertyAction { target: delegateItem; property: "ListView.delayRemove"; value: false }
                  }
              }
      //! [1]
          }
      
          // Simple header to test bug
          Component {
              id: headerComponent
              Rectangle {
                  id: header
                  height: 80
                  width: listView.width
                  color: "black"
                  border.color: Qt.lighter(color)
              }
          }
      
          // The view:
          ListView {
              id: listView
              anchors {
                  left: parent.left; top: parent.top;
                  right: parent.right; bottom: buttons.top;
                  margins: 20
              }
              model: fruitModel
              delegate: listDelegate
      
              header: headerComponent
              headerPositioning: ListView.PullBackHeader
          }
      
          Row {
              id: buttons
              anchors { left: parent.left; bottom: parent.bottom; margins: 20 }
              spacing: 10
      
              TextButton {
                  text: "Add an item"
                  onClicked: {
                      fruitModel.append({
                          "name": "Pizza Margarita",
                          "cost": 5.95,
                          "attributes": [{"description": "Cheese"}, {"description": "Tomato"}]
                      })
                  }
              }
      
              TextButton {
                  text: "Remove all items"
                  onClicked: fruitModel.clear()
              }
          }
      }
      

      Attachments

        Issue Links

          Activity

            People

              qt.team.quick.subscriptions Qt Quick and Widgets Team
              shtirliz72 Konstantin
              Votes:
              0 Vote for this issue
              Watchers:
              1 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: