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

Qt6中QML ListView访问C++ QObjectList模型时警告且无内容

Qt6 QML中QList<QObject*>模型无法显示的问题解决

问题原因

当你把QList<QObject*>作为QObject的属性暴露给QML时,ListView无法像ListModel那样直接访问元素的属性——因为QObjectList模型在QML中,每个列表项的上下文数据是通过modelData对象传递的,而非直接暴露属性。你当前的delegate使用了required property string name但未正确绑定到modelData.name,导致属性未初始化,进而出现警告且列表无内容。

解决方案

方案1:修改QML Delegate,通过modelData访问属性

直接在delegate中使用modelData获取Item对象的name属性,调整后的Main.qml代码如下:

import QtQuick

Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")

    ListModel {
        id: mockupList
        ListElement { name: "Hello" }
        ListElement { name: "World!" }
        ListElement { name: "How" }
        ListElement { name: "are" }
        ListElement { name: "you?" }
    }

    ListView {
        id: listView
        anchors.fill: parent
        anchors.margins: 20
        spacing: 10
        orientation: ListView.Vertical

        model: cppBackend.model

        delegate: Item {
            width: label.width
            height: label.height
            Text {
                id: label
                text: modelData.name // 直接通过modelData访问Item的name属性
                font.pointSize: 24
            }
        }

        header: Text {
            width: parent.width
            horizontalAlignment: Text.AlignHCenter
            font.pointSize: 48
            font.bold: true

            text: cppBackend.header
        }
    }
}

如果坚持使用required property,可以将属性绑定到modelData.name:

delegate: Item {
    id: myItem
    required property string name: modelData.name

    width: label.width
    height: label.height
    Text {
        id: label
        text: myItem.name
        font.pointSize: 24
    }
}

方案2:(可选)修正信号命名规范

虽然这不是当前问题的直接原因,但按照Qt的Q_PROPERTY命名规范,信号名应为属性名+Changed,而非on属性名Changed。修改Item类的信号定义:

class Item : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString name MEMBER m_name NOTIFY nameChanged) // 修正信号关联

public:
    Item(QString name, QObject *parent = nullptr)
        : QObject{parent}, m_name(name)
    {}

signals:
    void nameChanged(); // 修正信号名

private:
    QString m_name {"NULL"};
};

内容的提问来源于stack exchange,提问作者Ben Pyton

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 10:50:41