使用来自std :: map

时间:2016-03-02 13:53:53

标签: c++ qt mvvm qml

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

问题:如何在QML ListView中访问/显示地图项目​​ - 我无法理解,我在网上找不到任何有用的东西。

2 个答案:

答案 0 :(得分:2)

除了@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)

然后您应该能够通过ListView委托中的modelData.key和modelData.value使用它。

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

答案 1 :(得分:1)

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

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

所以你会:

std::map -> YourCustomListModel -> ListView