【问题标题】:Filling QML ListView with data from std::map用来自 std::map 的数据填充 QML ListView
【发布时间】:2016-03-02 13:53:53
【问题描述】:

我找不到在 QML 中显示 std::map 的项目的好方法。我们在我们的应用程序中使用了 MVVM 模式。 std::map 包含文件路径并且是模型中配置类的成员。 现在我试图在 QML 中显示地图的所有条目,可能使用ListView 项目。 目前我们在配置中只有几个文件路径,所以这些路径以Q_PROPERTYies 的形式暴露给视图模型,然后进一步暴露给 QML。但是,当然,路径的数量可以并且将会增长,因此我的想法是使用 std::map 来实现这一点。没有必要让它在运行时“可增长”,至少在可预见的将来不会。但是写很多很多Q_PROPERTYies 对我来说似乎不是正确的方式。

进一步的问题:我将如何访问/显示 QML ListView 中的地图项目 - 我无法弄清楚,我在网上找不到任何有用的东西。

【问题讨论】:

    标签: c++ qt mvvm qml


    【解决方案1】:

    @ddriver 建议的另一个选项是创建 QObject 派生类型的列表,例如:

    class ConfigObject: public QObject
    {
        Q_PROPERTY(QString key READ key)
        Q_PROPERTY(QString value READ value)
        // ... getters and key and value members
    };
    

    用它们填充 QList 并将它们作为 ListView 的模型通过

    QVariantList configModel;
    // ... fill it with ConfigObjects from std::map
    engine.rootContext()->setContextProperty("configModel", &configModel); //QQmlApplicationEngine here
    

    或某个类的属性:

    Q_PROPERTY(QVariant configModel READ configModel NOTIFY configModelChanged)
    

    那么您应该可以通过 modelData.key 和您的 ListView 委托中的 modelData.value 使用它。

    ListView {
        model: configModel // in case of using context
        delegate: Item {
            ...
            Text {
                text: modelData.key
            }
            Text {
                text: modelData.value
            }
        }
    }
    

    【讨论】:

    • 这看起来不错,感谢您提供替代解决方案和示例代码片段。
    【解决方案2】:

    您应该通过扩展QAbstractListModel 来实现std::map 的模型适配器,然后您可以将其用作QML ListView 的模型。实施正确的模型角色集将允许您访问映射元素成员,而无需使用Q_PROPERTY,这也需要QObject 派生数据类型。然后,您只需要将模型公开给 QML,例如作为上下文属性。

    请记住,地图是一个排序容器,因此如果您修改模型,您应该正确反映插入和删除的索引。

    所以你将拥有:

    std::map -> YourCustomListModel -> ListView

    【讨论】:

    • 很有道理,我找到了指向此解决方案的点点滴滴,但无法将它们放在一起,谢谢!选择 @rightaway717 的答案,因为它也有一些代码。
    • 您最终会遇到需要创建自己的模型的情况。我在这里发布了一个通用 QML 对象模型的实现,唯一的区别是这个使用 QList 而不是 std::map 进行存储:stackoverflow.com/questions/35160909/…
    猜你喜欢
    • 2017-12-23
    • 2017-05-24
    • 2011-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多