2016-03-02 110 views
0

我很难找到一种在QML中显示std::map的项目的好方法。我们在我们的应用程序中使用了MVVM模式。 std::map包含文件路径,并且是模型中配置类的成员。 现在我试图用QML显示地图的所有条目,可能使用ListView项目。 目前我们在配置中只有几个文件路径,所以这些文件会作为Q_PROPERTY发布到视图模型,然后再发布到QML。但是,当然,路径的数量可以并且会增长,因此我的想法使用了std::map。在运行时不需要“可扩展”,至少在不可预见的将来。但写很多很多Q_PROPERTY我似乎并不适合我。使用来自std :: map的数据填充QML ListView

Furhter问题:我将如何访问/显示QML中的地图项目ListView - 我找不出来,我找不到任何有用的信息。

回答

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 
     } 
    } 
} 
+0

这看起来不错,谢谢你提供了一个替代解决方案和示例代码片断。 – DenverCoder21

1

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

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

所以,你将有:

std::map -> YourCustomListModel -> ListView

+0

具有很大的意义,我找到了指示此解决方案的零碎件,但无法将它们放在一起,谢谢!选择@ rightaway717的答案,因为它也有一些代码。 – DenverCoder21

+0

您最终会遇到需要创建自己的模型的情况。我在这里发布了一个通用QML对象模型的实现,唯一的区别是这个使用QList而不是std :: map进行存储:http://stackoverflow.com/questions/35160909/how-to-create-a-通用对象模型的使用在qml/35161903#35161903 – dtech