Заполнение QML ListView данными из std :: map

У меня проблемы с поиском хорошего способа отображения предметов std::map в QML. Мы используем шаблон MVVM в нашем приложении. std::map содержит пути к файлам и является членом класса конфигурации в модели.
Теперь я пытаюсь показать все записи карты в QML, вероятно, используя ListView вещь.
В настоящее время у нас есть только несколько путей к файлам в конфигурации, поэтому они отображаются как Q_PROPERTYмодель представления, а затем — QML. Но, конечно, число путей может и будет расти, поэтому моя идея использовать std::map за это. Не будет необходимости иметь его «растущим» во время выполнения, по крайней мере, в обозримом будущем. Но писать много-много Q_PROPERTYЭто не кажется мне правильным.

Еще вопрос: как бы я получил доступ к элементам карты в QML? ListView — Я не могу понять это, и я не могу найти ничего полезного в Интернете.

0

Решение

Другим вариантом, отличным от предложенного @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 и modelData.value в вашем делегате ListView.

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

Другие решения

Вы должны реализовать модель адаптера для std::map расширяя QAbstractListModelтогда вы можете использовать это в качестве модели для QML ListView, Реализация правильного набора ролей модели позволит вам получить доступ к элементам элемента карты без необходимости использования Q_PROPERTY что также требует QObject производный тип данных. Затем вам нужно только представить модель в QML, например, в качестве свойства контекста.

Помните, что карта представляет собой отсортированный контейнер, поэтому, если вы изменяете модель, вы должны правильно отразить индекс вставки и удаления.

Итак, вы будете иметь:

std::map -> YourCustomListModel -> ListView

1

По вопросам рекламы [email protected]