2015-11-19 42 views
3

我想访问ListView中的委托属性。我试过contentItem,但有时候是undefined如何使用索引访问ListView中的委托属性

这里是我的代码:

ListModel{ 
      id: modeldata 
      ListElement{ 
       name:"don" 
       rank:1 
      } 
      ListElement{ 
       name:"shan" 
       rank:2 
      } 
      ListElement{ 
       name:"james" 
       rank:3 
      } 
      ListElement{ 
       name:"jeggu" 
       rank:4 
      } 
     } 
     Component{ 
      id: delegateitem 
      Row { 
       property int count: rank 
       Rectangle{ 
        width: 100 
        height: 50 
        Text{ 
         anchors.centerIn: parent 
         text: name 
        } 
       } 
      } 
     } 
     ListView{ 
      id: listview 
      focus: true 
      anchors.fill: parent 
      model: modeldata 
      delegate: delegateitem 
      onCurrentIndexChanged: { 
     console.log("position",currentIndex) 
     console.log("property",contentItem.children[currentIndex].count); 
      } 
     } 

问题在位置1

qml: position 0 
qml: property 1 
qml: position 1 
qml: property undefined 
qml: position 2 
qml: property 2 
qml: position 3 
qml: property 3 

回答

0

首先是无效的输出:如果你想从你的列表外部访问列表元素,这是一个很好的指标,你应该重新考虑你的设计。

现在的解决方案:一个列表视图比只有它的项目有更多的孩子。例如,您可以通过定义属性“属性字符串类型:”myType“”来过滤它们。然后通过遍历子元素来查找项目,并仅将类型属性等于“myType”的元素取出。 它有点黑客,但你再也不应该这样做了。

+0

这将是笨拙的代码并缓慢运行。如果我错了,也许提供一个代码示例来演示 –

5

@Teimpz并没有很好地解释它。特别是因为有一堆qt项目和Ubuntu的触摸qml的例子和使用情况下,你管理动态创建的列表元素使用JavaScript,这就是为什么他们有JavaScript的方法和属性

在QML有更多的概念父一个孩子,这在html中很常见。在更大的项目中,建议(如你可以在qt示例和文档http://doc.qt.io/qt-5/qtqml-javascript-expressions.html#functions-in-imported-javascript-files中看到的)将js逻辑与qml元素分开,以便从外部访问和管理元素,而不是污染qs元素而不是js逻辑一种寻找儿童元素的方式,而是暴露你需要的儿童元素。

在你的情况下,你应该只使用currentItem,就像你使用currentIndex一样,所以currentItem.count会给你你所需要的。直接从模型 如果你不都需要当前的项目,您可以访问元素:

modelData.get(currentIndex).count,或listview.model.get(currentIndex).count

至于由@Teimpz提到的黑客工具,也是一个坏榜样。如果您有更复杂的需求并希望委托内的特定元素,则每个委托都有ListView.isCurrentItem属性,您可以附加和检查该属性。这意味着你可以添加属性var myTargetItem到列表视图,并将其从子设置为任何你想要的元素,如果该代理是当前的http://doc.qt.io/qt-5/qml-qtquick-listview.html#isCurrentItem-attached-prop

你当然可以做任何事件,也许activeFocus所以你只能参考activeFocused项目。

这再一次给你能力,只显示想要的元素,没有任何先进的逻辑或倾泻。将此与信号相结合,您可以创建非常复杂但干净的界面,无需搜索儿童物品。

所以最终可能不太好,但仍然比寻找元素更好,将property int currentItemCount: 0添加到列表视图。在委托(行元素),然后添加property bool isCurrentItem: ListView.isCurrentItem 所以你进去的委托,在这里你可以做onIsCurrentItemChanged信号: onIsCurrentItemChanged: if(isCurrentItem) listview.currentItemCount = count 所以你有你的当前项目数总是设置

+0

感谢您提供关于从qml中分离js逻辑的有用说明。 –