我无法找到在QML中显示std::map
项目的好方法。我们在应用程序中使用MVVM模式。 std::map
包含文件路径,是模型中配置类的成员。
现在我试图在QML中显示地图的所有条目,可能使用ListView
项。
目前我们在配置中只有几个文件路径,因此这些路径以Q_PROPERTY
形式显示在视图模型中,然后再显示为QML。但是,当然,路径的数量可以并且将会增长,因此我的想法是使用std::map
。没有必要让它在运行时“可增长”,至少在可预见的未来不会。但是写出很多Q_PROPERTY
ies对我来说似乎并不合适。
问题:如何在QML ListView
中访问/显示地图项目 - 我无法理解,我在网上找不到任何有用的东西。
答案 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::map
为QAbstractListModel
实现模型适配器,然后您可以将其用作QML ListView
的模型。实现正确的模型角色集将允许您访问map元素成员,而无需使用Q_PROPERTY
,这也需要QObject
派生的数据类型。然后,您只需要将模型公开给QML,例如作为上下文属性。
请记住,地图是一个已排序的容器,因此如果您修改模型,则应正确反映插入和删除的索引。
所以你会:
std::map -> YourCustomListModel -> ListView