在 QML 中动态创建 ListModel

新手上路,请多包涵

当我需要在运行时创建任何 QML 组件时,我可以使用该指南:http: //qt-project.org/doc/qt-5/qtqml-javascript-dynamicobjectcreation.html

即只调用 Qt.createComponent 和 component.createObject

但是我找不到如何在运行时创建 ListModel?使用 qml,而不是 c++。

你可以问,为什么我需要它。所以,我有一个嵌套的 ListModel:有一个 _外部模型_,它代表包含 _内部模型_。因此,当我调用 outer_model.append({}) 时,我必须为 内部模型 传递新创建的 ListModel。我不能在外部委托中使用静态定义的 _内部模型_,因为我不能在运行时访问这样的模型。顺便问一下,它可以以某种方式访问吗?

PS 也许尝试在 javascript 中管理模型是完全错误的想法?

原文由 Konstantin Utkin 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

尝试这个:

 Component {
    id: someComponent
    ListModel {
    }
}

function createModel(parent) {
    var newModel = someComponent.createObject(parent);
    return newModel;
}

原文由 folibis 发布,翻译遵循 CC BY-SA 3.0 许可协议

我是一名编写 QtQuick 应用程序的 JS 开发人员,这是我尝试过的多种解决方案。

在 QML 中用 JavaScript 管理模型的简短回答是, 这是一场噩梦。我建议您编写 QAbstractListModel 的一个小子类,它在内部使用 QJsonArray 作为其数据源,这样可以更容易理解 C++ 中的数据结构及其在 QML 中的用法。按照 此处 的说明从 C++ 创建 QML 类型。

如果您仍想在 JavaScript 中执行此操作,另一种方法如下:

 function createNewList() {
    var newListModel = Qt.createQmlObject('import QtQuick 2.2; \
        ListModel {}', parent);
    return newListModel;
}

然而,即使在使用 gc() 之后,这也有一些严重的内存泄漏问题

如果您主要关心的是在 ListModels 中使用 ListModels,那么下面这个简单的事情对我有用(我认为对象数组和 ListModels 中的 ListModels 之间存在隐式类型转换)

 property ListModel items: ListModel {}

function addComplexItem() {
    items.append({
        "key": "People",
        "arr": [
            {
             "arrItemName": "John",
             "arrItemValue": 18,
            },
            {
             "arrItemName": "Kerry",
             "arrItemValue": 21,
            },
            {
             "arrItemName": "Mike",
             "arrItemValue": 19,
            }
        ]});
}

// Usage
Component {
    id: viewDelegate

    Item {
        Text {
            text: "List of " + key
        }
        ListView {
            model: arr
            delegate: Rectangle {
                Text {
                    text: arrItemName
                }
            }
        }
    }
}

原文由 islahul 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏