У меня проблемы с поиском хорошего способа отображения предметов std::map
в QML. Мы используем шаблон MVVM в нашем приложении. std::map
содержит пути к файлам и является членом класса конфигурации в модели.
Теперь я пытаюсь показать все записи карты в QML, вероятно, используя ListView
вещь.
В настоящее время у нас есть только несколько путей к файлам в конфигурации, поэтому они отображаются как Q_PROPERTY
модель представления, а затем — QML. Но, конечно, число путей может и будет расти, поэтому моя идея использовать std::map
за это. Не будет необходимости иметь его «растущим» во время выполнения, по крайней мере, в обозримом будущем. Но писать много-много Q_PROPERTY
Это не кажется мне правильным.
Еще вопрос: как бы я получил доступ к элементам карты в QML? 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)
Тогда вы сможете использовать его через modelData.key
и modelData.value в вашем делегате ListView.
ListView {
model: configModel // in case of using context
delegate: Item {
...
Text {
text: modelData.key
}
Text {
text: modelData.value
}
}
}
Вы должны реализовать модель адаптера для std::map
расширяя QAbstractListModel
тогда вы можете использовать это в качестве модели для QML ListView
, Реализация правильного набора ролей модели позволит вам получить доступ к элементам элемента карты без необходимости использования Q_PROPERTY
что также требует QObject
производный тип данных. Затем вам нужно только представить модель в QML, например, в качестве свойства контекста.
Помните, что карта представляет собой отсортированный контейнер, поэтому, если вы изменяете модель, вы должны правильно отразить индекс вставки и удаления.
Итак, вы будете иметь:
std::map -> YourCustomListModel -> ListView