如何获取QML ListView中以Loader为代理的Item的objectName?
问题分析
你当前代码里,mylistview.itemAtIndex(...) 获取到的是ListView的代理Item(即delegate中定义的Item),而非Loader加载的目标控件,自然拿不到Loader的item属性。另外Loader是异步加载组件的,即便能访问到Loader,也要等加载完成后item才会有效。
解决方案
只需修改代理定义,让代理Item暴露Loader加载项的objectName,同时处理加载未完成的场景,外部就能直接从代理Item获取对应值。
修改后的main.qml代码:
import QtQuick Window { width: 640 height: 480 visible: true title: qsTr("Hello World") ListModel { id: viewModel ListElement { view: "test.qml" } ListElement { view: "test2.qml" } } ListView { id: mylistview width: 400 height: 400 anchors.fill: parent clip: true spacing: 2 model: viewModel delegate: Item { // 新增属性,绑定Loader.item的objectName,未加载时为空字符串 property string loadedObjectName: loader.item ? loader.item.objectName : "" Loader { id: loader // 仅在代理内部用于访问item,外部无需操作此Loader source: view } } } Text { id: mytext width: 100 height: 100 x:0 y:0 // 直接访问代理Item的loadedObjectName属性 text: mylistview.currentItem ? mylistview.currentItem.loadedObjectName : "" } Text { id: mytext2 width: 100 height: 100 x:100 y:0 text: mylistview.currentIndex } }
关键说明
- 给代理内部的Loader设置id(
loader),仅用于代理内部访问其item属性,外部无需直接操作该Loader。 - 代理Item新增
loadedObjectName属性,通过三元表达式处理Loader未加载完成(item为null)的情况,避免运行时报错。 - 外部获取时,用
mylistview.currentItem替代itemAtIndex,更贴合ListView的常规用法,同时处理currentItem为null的场景(比如ListView未初始化时)。
内容的提问来源于stack exchange,提问作者Shazter
相关产品推荐
相关产品推荐

