@Teimpz 并没有很好地解释它。特别是因为有一堆 qt 项目和 ubuntu touch qml 示例和用例,您可以使用 javascript 管理动态创建的列表元素,这就是为什么它们具有 javascript 方法和属性
在 QML 中,父级概念多于子级概念,这在 html 中很常见。在较大的项目中,建议这样做(正如您也可以在 qt 示例和文档中看到的那样)http://doc.qt.io/qt-5/qtqml-javascript-expressions.html#functions-in-imported-javascript-files http://doc.qt.io/qt-5/qtqml-javascript-expressions.html#functions-in-imported-javascript-files)将 js 逻辑与 qml 元素分开,这样您就可以从外部访问和管理元素,而不是用 js 逻辑污染您的 qml 元素,但不是以查找子元素的方式,而是公开您需要的子元素。
在你的情况下你应该只使用currentItem
,与使用 currentIndex 相同,所以currentItem.count
会给你你所需要的。
如果您根本不需要当前项目,您可以直接从模型访问元素:
modelData.get(currentIndex).count
, or listview.model.get(currentIndex).count
至于@Teimpz 提到的黑客行为,这也是一个不好的例子。当您有更复杂的需求并希望在委托中使用特定元素时,每个委托都有 ListView.isCurrentItem 属性,您可以附加和检查该属性。这意味着您可以将属性 var myTargetItem 添加到 listview,并将其从子元素设置为您想要的任何元素(如果该委托是当前的)http://doc.qt.io/qt-5/qml-qtquick-listview.html#isCurrentItem-attached-prop http://doc.qt.io/qt-5/qml-qtquick-listview.html#isCurrentItem-attached-prop
当然,您可以对任何类型的事件执行此操作,也许是 activeFocus,因此您只能引用 activeFocus 项目。
这再次使您能够仅公开想要的元素,而无需任何高级逻辑或删除。将其与信号相结合,您可以创建非常复杂但干净的界面,而无需搜索子项。
所以最后可能不太好但仍然比搜索元素更好的是添加property int currentItemCount: 0
到列表视图。然后在委托(行元素)中添加property bool isCurrentItem: ListView.isCurrentItem
所以你得到onIsCurrentItemChanged
在委托内部发出信号,您可以在其中执行以下操作:
onIsCurrentItemChanged: if(isCurrentItem) listview.currentItemCount = count
所以你总是设置当前的项目计数