|
- //代码如下
- import QtQuick 1.1
- Rectangle {
- width: 800
- height: 480
- color: "black"
- property int _totalHeight: 0
- property int _currentIndex: -1
- property int _storeY
- Rectangle {
- width: 220
- height: 300
- anchors.centerIn: parent
- color: "blue"
- clip: true
- Item {
- id: item
- width: 200
- height: 300
- ListView {
- id: listview
- anchors.fill: parent
- model: nestedModel
- delegate: categoryDelegate
- clip: true
- onContentHeightChanged: {
- _totalHeight = getViewHeight();
- }
- }
- ListModel {
- id: nestedModel
- ListElement {
- categoryName: "Veggies"
- collapsed: true
- // A ListElement can't contain child elements, but it can contain
- // a list of elements. A list of ListElements can be used as a model
- // just like any other model type.
- subItems: [
- ListElement { itemName: "Tomato" },
- ListElement { itemName: "Cucumber" },
- ListElement { itemName: "Onion" },
- ListElement { itemName: "Brains" }
- ]
- }
- ListElement {
- categoryName: "Fruits"
- collapsed: true
- subItems: [
- ListElement { itemName: "Orange" },
- ListElement { itemName: "Apple" },
- ListElement { itemName: "Pear" },
- ListElement { itemName: "Lemon" }
- ]
- }
- ListElement {
- categoryName: "Cars"
- collapsed: true
- subItems: [
- ListElement { itemName: "Nissan" },
- ListElement { itemName: "Toyota" },
- ListElement { itemName: "Chevy" },
- ListElement { itemName: "Audi" }
- ]
- }
- ListElement {
- categoryName: "Veggies"
- collapsed: true
- // A ListElement can't contain child elements, but it can contain
- // a list of elements. A list of ListElements can be used as a model
- // just like any other model type.
- subItems: [
- ListElement { itemName: "Tomato" },
- ListElement { itemName: "Cucumber" },
- ListElement { itemName: "Onion" },
- ListElement { itemName: "Brains" }
- ]
- }
- ListElement {
- categoryName: "Fruits"
- collapsed: true
- subItems: [
- ListElement { itemName: "Orange" },
- ListElement { itemName: "Apple" },
- ListElement { itemName: "Pear" },
- ListElement { itemName: "Lemon" }
- ]
- }
- ListElement {
- categoryName: "Cars"
- collapsed: true
- subItems: [
- ListElement { itemName: "Nissan" },
- ListElement { itemName: "Toyota" },
- ListElement { itemName: "Chevy" },
- ListElement { itemName: "Audi" }
- ]
- }
- ListElement {
- categoryName: "Veggies"
- collapsed: true
- // A ListElement can't contain child elements, but it can contain
- // a list of elements. A list of ListElements can be used as a model
- // just like any other model type.
- subItems: [
- ListElement { itemName: "Tomato" },
- ListElement { itemName: "Cucumber" },
- ListElement { itemName: "Onion" },
- ListElement { itemName: "Brains" }
- ]
- }
- ListElement {
- categoryName: "Fruits"
- collapsed: true
- subItems: [
- ListElement { itemName: "Orange" },
- ListElement { itemName: "Apple" },
- ListElement { itemName: "Pear" },
- ListElement { itemName: "Lemon" }
- ]
- }
- ListElement {
- categoryName: "Cars"
- collapsed: true
- subItems: [
- ListElement { itemName: "Nissan" },
- ListElement { itemName: "Toyota" },
- ListElement { itemName: "Chevy" },
- ListElement { itemName: "Audi" }
- ]
- }
- }
- Component {
- id: categoryDelegate
- Column {
- width: 200
- Rectangle {
- id: categoryItem
- border.color: "black"
- border.width: 5
- color: "white"
- height: 50
- width: 200
- Text {
- anchors.verticalCenter: parent.verticalCenter
- x: 15
- font.pixelSize: 24
- text: categoryName
- }
- Rectangle {
- color: "red"
- width: 30
- height: 30
- anchors.right: parent.right
- anchors.rightMargin: 15
- anchors.verticalCenter: parent.verticalCenter
- MouseArea {
- anchors.fill: parent
- // Toggle the 'collapsed' property
- onClicked:{
- do {
- if(_currentIndex === -1) break;
- if(_currentIndex === index) break;
- if(nestedModel.get(_currentIndex).collapsed === true) break;
- nestedModel.setProperty(_currentIndex, "collapsed", true)
- }while(0);
- _currentIndex = index;
- nestedModel.setProperty(index, "collapsed", !collapsed)
- _totalHeight = getViewHeight();
- }
- }
- }
- }
- Loader {
- id: subItemLoader
- // This is a workaround for a bug/feature in the Loader element. If sourceComponent is set to null
- // the Loader element retains the same height it had when sourceComponent was set. Setting visible
- // to false makes the parent Column treat it as if it's height was 0.
- visible: !collapsed
- property variant subItemModel : subItems
- sourceComponent: collapsed ? null : subItemColumnDelegate
- onStatusChanged: if (status == Loader.Ready) item.model = subItemModel
- }
- }
- }
- Component {
- id: subItemColumnDelegate
- Column {
- property alias model : subItemRepeater.model
- width: 200
- Repeater {
- id: subItemRepeater
- delegate: Rectangle {
- color: "#cccccc"
- height: 40
- width: 200
- border.color: "black"
- border.width: 2
- Text {
- anchors.verticalCenter: parent.verticalCenter
- x: 30
- font.pixelSize: 18
- text: itemName
- }
- }
- }
- }
- }
- }
- Rectangle {
- id: scrollBar
- width: 20
- height: parent.height
- anchors.right: parent.right
- y: 0
- color: "white"
- Rectangle {
- id: button1
- x: 0
- width: 20
- y: listview.contentY/_totalHeight * scrollBar.height //scrollBar.height * listview.visibleArea.yPosition
- height: listview.height * scrollBar.height / _totalHeight
- color: "red"
- Rectangle{
- height: 10
- width: parent.width
- anchors.top: parent.top
- anchors.left: parent.left
- color: "green"
- }
- Rectangle{
- height: 10
- width: parent.width
- anchors.bottom: parent.bottom
- anchors.left: parent.left
- color: "green"
- }
- MouseArea {
- anchors.fill: button1
- drag.target: button1
- drag.axis: Drag.YAxis
- drag.maximumY: scrollBar.height - button1.height
- drag.minimumY: 0
- onPositionChanged: {
- listview.contentY = button1.y * _totalHeight / scrollBar.height
- }
- }
- }
- }
- }
- function getViewHeight(){
- var viewHeight = 0;
- for(var i = 0 ; i < nestedModel.count ; i++){
- if(nestedModel.get(i).collapsed === true){
- viewHeight += 50 ;
- }
- else {
- viewHeight += ( 50+ nestedModel.get(i).subItems.count * 40) ;
- }
- }
- return viewHeight
- }
- }
问题,当第一个index打开的时候然后把滑动条滑到 显示最后一个,再点击打开的时候滑动条显示就开始不正常了,而且不能回复。请问大家有什么解决方案吗 ?
|