How to make QML ListView align bottom-to-top: Difference between revisions

From Qt Wiki
Jump to navigation Jump to search
(Add "cleanup" tag)
(Cleanup)
Line 1: Line 1:
{{Cleanup | reason=Auto-imported from ExpressionEngine.}}
{{LangSwitch}}
 
[[Category:Snippets]]
[[Category:Snippets]]
[[Category:HowTo]]
[[Category:HowTo]]
[[Category:Developing_with_Qt::Qt Quick]]
[[Category:Developing_with_Qt::Qt Quick]]
[[Category:Developing_with_Qt::Qt Quick::QML]]
[[Category:Developing_with_Qt::Qt Quick::QML]]
'''English''' | [[:How_to_make_QML_ListView_align_bottom-to-top_German|Deutsch]] | [[:How_to_make_QML_ListView_align_bottom-to-top_Bulgarian|Български]]
= How to make QML ListView align bottom-to-top =
Normally QML ListView aligns all items at the top. New items get stacked on bottom. For some use cases like a conversations view you may want a different layout which starts at the bottom and also adds new items there.
Normally QML ListView aligns all items at the top. New items get stacked on bottom. For some use cases like a conversations view you may want a different layout which starts at the bottom and also adds new items there.
This is how the ListView normally looks like:
[[Image:http://gri.not-censored.com/normal-listview.png|http://gri.not-censored.com/normal-listview.png]]


== The solution ==
== The solution ==
Line 22: Line 13:
* '''Also''' rotate the Delegate by 180° to get it back to normal direction. Don't forget to give the delegate the whole width of ListView.view.width! Otherwise your items are right-aligned.
* '''Also''' rotate the Delegate by 180° to get it back to normal direction. Don't forget to give the delegate the whole width of ListView.view.width! Otherwise your items are right-aligned.
* In order to get the newest items at the bottom, always insert the newest one at index 0 instead of appending it.
* In order to get the newest items at the bottom, always insert the newest one at index 0 instead of appending it.
After doing these steps, your view should look like this:
[[Image:http://gri.not-censored.com/listview-bottom-to-top.png|http://gri.not-censored.com/listview-bottom-to-top.png]]


== The test code ==
== The test code ==
Line 32: Line 20:


Rectangle {
Rectangle {
width: 300
    width: 300
height: 300
    height: 300
 
   
Rectangle {
    Rectangle {
id: button
        id: button
color: "red"
        color: "red"
 
        height: 20
anchors {
        anchors {
top: parent.top
            top: parent.top
left: parent.left
            left: parent.left
right: parent.right
            right: parent.right
}
        }
 
       
height: 20
        Text {
 
            anchors.centerIn: parent
Text {
            text: "Click me to add rows"
anchors.centerIn: parent
        }
text: "Click me to add rows"
}
 
MouseArea {
anchors.fill: parent
onClicked: {
var row = {
"id":listModel.count
};


listModel.insert(0, row);
        MouseArea {
}
            anchors.fill: parent
}
            onClicked: {
}
                var row = { "id":listModel.count }
                listModel.insert(0, row)
            }
        }
    }


ListView {
    ListView {
rotation: 180
        rotation: 180


anchors {
        anchors {
top: button.bottom
            top: button.bottom
bottom: parent.bottom
            bottom: parent.bottom
left: parent.left
            left: parent.left
right: parent.right
            right: parent.right
}
        }


model: ListModel {
        model: ListModel {
id: listModel
            id: listModel
}
        }


delegate: Rectangle {
        delegate: Rectangle {
rotation: 180
            rotation: 180
width: ListView.view.width
            width: ListView.view.width
height: 20
            height: 20
color: "green"
            color: "green"


Text {
            Text {
anchors.centerIn: parent
                anchors.centerIn: parent
text: model.id
                text: model.id
}
            }
}
        }
}
    }
}
}

Revision as of 19:09, 28 June 2015

En Ar Bg De El Es Fa Fi Fr Hi Hu It Ja Kn Ko Ms Nl Pl Pt Ru Sq Th Tr Uk Zh

Normally QML ListView aligns all items at the top. New items get stacked on bottom. For some use cases like a conversations view you may want a different layout which starts at the bottom and also adds new items there.

The solution

The solution is easier than most people think. Rotation is the keyword.

  • Rotate the ListView by 180°
  • Also rotate the Delegate by 180° to get it back to normal direction. Don't forget to give the delegate the whole width of ListView.view.width! Otherwise your items are right-aligned.
  • In order to get the newest items at the bottom, always insert the newest one at index 0 instead of appending it.

The test code

import QtQuick 1.0

Rectangle {

   width: 300
   height: 300
   
   Rectangle {
       id: button
       color: "red"
       height: 20
       anchors {
           top: parent.top
           left: parent.left
           right: parent.right
       }
        
       Text {
           anchors.centerIn: parent
           text: "Click me to add rows"
       }
       MouseArea {
           anchors.fill: parent
           onClicked: {
               var row = { "id":listModel.count }
               listModel.insert(0, row)
           }
       }
   }
   ListView {
       rotation: 180
       anchors {
           top: button.bottom
           bottom: parent.bottom
           left: parent.left
           right: parent.right
       }
       model: ListModel {
           id: listModel
       }
       delegate: Rectangle {
           rotation: 180
           width: ListView.view.width
           height: 20
           color: "green"
           Text {
               anchors.centerIn: parent
               text: model.id
           }
       }
   }

}