You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 04:17:35