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

ListView.PullBackHeader or OverlayHeader lead to program hang

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Duplicate
    • Icon: Not Evaluated 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

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

        1. program hangs.png
          259 kB
          Konstantin
        No reviews matched the request. Check your Options in the drop-down menu of this sections header.

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

              Created:
              Updated:
              Resolved:

                There are no open Gerrit changes