C++ 用std::map中的数据填充QML ListView

C++ 用std::map中的数据填充QML ListView,c++,qt,mvvm,qml,C++,Qt,Mvvm,Qml,我很难找到一种在QML中显示std::map项的好方法。我们在应用程序中使用MVVM模式。std::map包含文件路径,是模型中配置类的成员。 现在,我试图在QML中显示映射的所有条目,可能使用ListView项。 目前,我们在配置中只有两个文件路径,因此这些路径作为Q_属性ie公开给视图模型,然后进一步公开给QML。但是,当然,路径的数量可以而且将会增加,因此我的想法是使用std::map来实现这一点。不需要在运行时让它“可增长”,至少在可预见的将来是这样。但是写很多的Q_属性ie对我来说似乎

我很难找到一种在QML中显示
std::map
项的好方法。我们在应用程序中使用MVVM模式。
std::map
包含文件路径,是模型中配置类的成员。 现在,我试图在QML中显示映射的所有条目,可能使用
ListView
项。 目前,我们在配置中只有两个文件路径,因此这些路径作为
Q_属性
ie公开给视图模型,然后进一步公开给QML。但是,当然,路径的数量可以而且将会增加,因此我的想法是使用
std::map
来实现这一点。不需要在运行时让它“可增长”,至少在可预见的将来是这样。但是写很多的
Q_属性
ie对我来说似乎并不合适


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

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

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

因此,您将有:


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

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

因此,您将有:


std::map->YourCustomListModel->ListView

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

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

这看起来不错,感谢您提供了替代解决方案和示例代码段。这看起来不错,感谢您提供了替代解决方案和示例代码段。很有意义,我找到了指向此解决方案的位和段,但无法将它们放在一起,谢谢!选择@rightaway717的答案,因为它也有一些代码。你最终会遇到需要创建自己的模型的情况。我在这里发布了一个通用QML对象模型的实现,唯一的区别是它使用QList而不是std::map进行存储:很有意义,我找到了这个解决方案的一些细节,但无法将它们组合在一起,谢谢!选择@rightaway717的答案,因为它也有一些代码。你最终会遇到需要创建自己的模型的情况。我在这里发布了一个通用QML对象模型的实现,唯一的区别是它使用QList而不是std::map进行存储: