2016-03-02 2 views
0

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

Вопрос 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) 

Тогда вы должны быть в состоянии использовать его через modelData.key и modelData.value в вашей ListView делегата.

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

Это выглядит хорошо, спасибо за предоставление альтернативного решения и образцовых фрагментов кода. – DenverCoder21

1

Вы должны реализовать адаптер модели для std::map, расширив QAbstractListModel, а затем вы можете использовать его как модель для 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- generic-object-model-for-use-in-qml/35161903 # 35161903 – dtech

Смежные вопросы