• 5276阅读
  • 0回复

qml listview实现简单树模型,listview的滑动条出现问题 [复制链接]

上一主题 下一主题
离线598316507
 

只看楼主 倒序阅读 楼主  发表于: 2015-07-29
  1. //代码如下
  2. import QtQuick 1.1
  3. Rectangle {
  4.     width: 800
  5.     height: 480
  6.     color: "black"
  7.     property int _totalHeight: 0
  8.     property int _currentIndex: -1
  9.     property int _storeY
  10.     Rectangle {
  11.         width: 220
  12.         height: 300
  13.         anchors.centerIn: parent
  14.         color: "blue"
  15.         clip: true
  16.         Item {
  17.             id: item
  18.             width: 200
  19.             height: 300
  20.             ListView {
  21.                 id: listview
  22.                 anchors.fill: parent
  23.                 model: nestedModel
  24.                 delegate: categoryDelegate
  25.                 clip: true
  26.                 onContentHeightChanged: {
  27.                     _totalHeight = getViewHeight();
  28.                 }
  29.             }
  30.             ListModel {
  31.                 id: nestedModel
  32.                 ListElement {
  33.                     categoryName: "Veggies"
  34.                     collapsed: true
  35.                     // A ListElement can't contain child elements, but it can contain
  36.                     // a list of elements. A list of ListElements can be used as a model
  37.                     // just like any other model type.
  38.                     subItems: [
  39.                         ListElement { itemName: "Tomato" },
  40.                         ListElement { itemName: "Cucumber" },
  41.                         ListElement { itemName: "Onion" },
  42.                         ListElement { itemName: "Brains" }
  43.                     ]
  44.                 }
  45.                 ListElement {
  46.                     categoryName: "Fruits"
  47.                     collapsed: true
  48.                     subItems: [
  49.                         ListElement { itemName: "Orange" },
  50.                         ListElement { itemName: "Apple" },
  51.                         ListElement { itemName: "Pear" },
  52.                         ListElement { itemName: "Lemon" }
  53.                     ]
  54.                 }
  55.                 ListElement {
  56.                     categoryName: "Cars"
  57.                     collapsed: true
  58.                     subItems: [
  59.                         ListElement { itemName: "Nissan" },
  60.                         ListElement { itemName: "Toyota" },
  61.                         ListElement { itemName: "Chevy" },
  62.                         ListElement { itemName: "Audi" }
  63.                     ]
  64.                 }
  65.                 ListElement {
  66.                     categoryName: "Veggies"
  67.                     collapsed: true
  68.                     // A ListElement can't contain child elements, but it can contain
  69.                     // a list of elements. A list of ListElements can be used as a model
  70.                     // just like any other model type.
  71.                     subItems: [
  72.                         ListElement { itemName: "Tomato" },
  73.                         ListElement { itemName: "Cucumber" },
  74.                         ListElement { itemName: "Onion" },
  75.                         ListElement { itemName: "Brains" }
  76.                     ]
  77.                 }
  78.                 ListElement {
  79.                     categoryName: "Fruits"
  80.                     collapsed: true
  81.                     subItems: [
  82.                         ListElement { itemName: "Orange" },
  83.                         ListElement { itemName: "Apple" },
  84.                         ListElement { itemName: "Pear" },
  85.                         ListElement { itemName: "Lemon" }
  86.                     ]
  87.                 }
  88.                 ListElement {
  89.                     categoryName: "Cars"
  90.                     collapsed: true
  91.                     subItems: [
  92.                         ListElement { itemName: "Nissan" },
  93.                         ListElement { itemName: "Toyota" },
  94.                         ListElement { itemName: "Chevy" },
  95.                         ListElement { itemName: "Audi" }
  96.                     ]
  97.                 }
  98.                 ListElement {
  99.                     categoryName: "Veggies"
  100.                     collapsed: true
  101.                     // A ListElement can't contain child elements, but it can contain
  102.                     // a list of elements. A list of ListElements can be used as a model
  103.                     // just like any other model type.
  104.                     subItems: [
  105.                         ListElement { itemName: "Tomato" },
  106.                         ListElement { itemName: "Cucumber" },
  107.                         ListElement { itemName: "Onion" },
  108.                         ListElement { itemName: "Brains" }
  109.                     ]
  110.                 }
  111.                 ListElement {
  112.                     categoryName: "Fruits"
  113.                     collapsed: true
  114.                     subItems: [
  115.                         ListElement { itemName: "Orange" },
  116.                         ListElement { itemName: "Apple" },
  117.                         ListElement { itemName: "Pear" },
  118.                         ListElement { itemName: "Lemon" }
  119.                     ]
  120.                 }
  121.                 ListElement {
  122.                     categoryName: "Cars"
  123.                     collapsed: true
  124.                     subItems: [
  125.                         ListElement { itemName: "Nissan" },
  126.                         ListElement { itemName: "Toyota" },
  127.                         ListElement { itemName: "Chevy" },
  128.                         ListElement { itemName: "Audi" }
  129.                     ]
  130.                 }
  131.             }
  132.             Component {
  133.                 id: categoryDelegate
  134.                 Column {
  135.                     width: 200
  136.                     Rectangle {
  137.                         id: categoryItem
  138.                         border.color: "black"
  139.                         border.width: 5
  140.                         color: "white"
  141.                         height: 50
  142.                         width: 200
  143.                         Text {
  144.                             anchors.verticalCenter: parent.verticalCenter
  145.                             x: 15
  146.                             font.pixelSize: 24
  147.                             text: categoryName
  148.                         }
  149.                         Rectangle {
  150.                             color: "red"
  151.                             width: 30
  152.                             height: 30
  153.                             anchors.right: parent.right
  154.                             anchors.rightMargin: 15
  155.                             anchors.verticalCenter: parent.verticalCenter
  156.                             MouseArea {
  157.                                 anchors.fill: parent
  158.                                 // Toggle the 'collapsed' property
  159.                                 onClicked:{
  160.                                     do {
  161.                                         if(_currentIndex === -1)        break;
  162.                                         if(_currentIndex === index)     break;
  163.                                         if(nestedModel.get(_currentIndex).collapsed === true)   break;
  164.                                         nestedModel.setProperty(_currentIndex, "collapsed", true)
  165.                                     }while(0);
  166.                                     _currentIndex = index;
  167.                                     nestedModel.setProperty(index, "collapsed", !collapsed)
  168.                                     _totalHeight = getViewHeight();
  169.                                 }
  170.                             }
  171.                         }
  172.                     }
  173.                     Loader {
  174.                         id: subItemLoader
  175.                         // This is a workaround for a bug/feature in the Loader element. If sourceComponent is set to null
  176.                         // the Loader element retains the same height it had when sourceComponent was set. Setting visible
  177.                         // to false makes the parent Column treat it as if it's height was 0.
  178.                         visible: !collapsed
  179.                         property variant subItemModel : subItems
  180.                         sourceComponent: collapsed ? null : subItemColumnDelegate
  181.                         onStatusChanged: if (status == Loader.Ready) item.model = subItemModel
  182.                     }
  183.                 }
  184.             }
  185.             Component {
  186.                 id: subItemColumnDelegate
  187.                 Column {
  188.                     property alias model : subItemRepeater.model
  189.                     width: 200
  190.                     Repeater {
  191.                         id: subItemRepeater
  192.                         delegate: Rectangle {
  193.                             color: "#cccccc"
  194.                             height: 40
  195.                             width: 200
  196.                             border.color: "black"
  197.                             border.width: 2
  198.                             Text {
  199.                                 anchors.verticalCenter: parent.verticalCenter
  200.                                 x: 30
  201.                                 font.pixelSize: 18
  202.                                 text: itemName
  203.                             }
  204.                         }
  205.                     }
  206.                 }
  207.             }
  208.         }
  209.         Rectangle {
  210.             id: scrollBar
  211.             width: 20
  212.             height: parent.height
  213.             anchors.right: parent.right
  214.             y: 0
  215.             color: "white"
  216.             Rectangle {
  217.                 id: button1
  218.                 x: 0
  219.                 width: 20
  220.                 y: listview.contentY/_totalHeight * scrollBar.height   //scrollBar.height * listview.visibleArea.yPosition
  221.                 height: listview.height * scrollBar.height / _totalHeight
  222.                 color: "red"
  223.                 Rectangle{
  224.                     height: 10
  225.                     width: parent.width
  226.                     anchors.top: parent.top
  227.                     anchors.left: parent.left
  228.                     color: "green"
  229.                 }
  230.                 Rectangle{
  231.                     height: 10
  232.                     width: parent.width
  233.                     anchors.bottom: parent.bottom
  234.                     anchors.left: parent.left
  235.                     color: "green"
  236.                 }
  237.                 MouseArea {
  238.                     anchors.fill: button1
  239.                     drag.target: button1
  240.                     drag.axis: Drag.YAxis
  241.                     drag.maximumY: scrollBar.height - button1.height
  242.                     drag.minimumY: 0
  243.                     onPositionChanged: {
  244.                         listview.contentY = button1.y * _totalHeight / scrollBar.height
  245.                     }
  246.                 }
  247.             }
  248.         }
  249.     }
  250.     function getViewHeight(){
  251.         var viewHeight = 0;
  252.         for(var i = 0 ; i < nestedModel.count ; i++){
  253.             if(nestedModel.get(i).collapsed === true){
  254.                 viewHeight += 50 ;
  255.             }
  256.             else {
  257.                 viewHeight += ( 50+ nestedModel.get(i).subItems.count * 40) ;
  258.             }
  259.         }
  260.         return viewHeight
  261.     }
  262. }

问题,当第一个index打开的时候然后把滑动条滑到显示最后一个,再点击打开的时候滑动条显示就开始不正常了,而且不能回复。请问大家有什么解决方案吗 ?
快速回复
限100 字节
 
上一个 下一个