Всё в модель!

Итак, задачи перекинуть какой либо список из C++ в QML у меня возникают достаточно часто и первый раз решая её я потратил на это дело 2 дня! Жуть же? Ну я нуб так что мне можно...

Итак задача: Необходим список треков в плейлисте. Тоесть список их ID в базе данных. QList к сожалению QML не понимает от слова совсем и нам пригодится такая стращная штука как QAbstractListMode вещица достаточно интересная и масивная, но мы пробежимся по верхушкам...

Итак поехали: результат работы можно сразу посмотреть по ссылкам:

https://github.com/neochapay/radon/blob/master/src/model/playlistmodel.cpp

https://github.com/neochapay/radon/blob/master/src/model/playlistmodel.h

Мой мозг проел PHP и по этому мне удобнее работать с ассативными массивами, но QList не принимает несколько параметров - выход: делаем структуру:

Код CPP-QT:
  1. struct playListItem{int trackId; QString trackType; bool playEd;};
Пункт следующий: Говорим модели какие поля у нас будут, именно их мы и получим при экспорте в QML


Код CPP-QT:
  1.  
  2. PlayListModel::PlayListModel(QObject *parent) :
  3. {
  4. hash.insert(Qt::UserRole ,QByteArray("trackId"));
  5. hash.insert(Qt::UserRole+1 ,QByteArray("trackType"));
  6. hash.insert(Qt::UserRole+2 ,QByteArray("playEd"));
  7. }
  8.  
Только бы не забыть объявить в хедаре хеш:

Код CPP-QT:
  1. private:
  2. QHash hash;
и функцию вывода всех полей:

Код CPP-QT:
  1. QHash roleNames() const {return hash;}
Теперь самая страшная функция, которая по сути то своей и выдаёт все данные!

Код CPP-QT:
  1. QVariant PlayListModel::data(const QModelIndex &index, int role) const
  2. {
  3. if (!index.isValid())
  4. return QVariant();
  5.  
  6. if (index.row() >= playList.size())
  7. return QVariant();
  8. playListItem item = playList.at(index.row());
  9. if(role == Qt::UserRole)
  10. {
  11. return item.trackId;
  12. }
  13. else if(role == Qt::UserRole+1)
  14. {
  15. return item.trackType;
  16. }
  17. else if(role == Qt::UserRole+2)
  18. {
  19. return item.playEd;
  20. }
  21. return QVariant();
  22. }
  23.  
Суть её достаточно проста QML при delegate сообщает свой index - тоесть номер по порядку - мы выбираем объект и в зависимости от роли выдаём нужные данные. Для меня этот участок был самым сложным, ну а думаю с добавлением и удалением объектов модели у вас всё получится - если нет - смотрите код :)
Комментарии (0)

Нет комментариев. Ваш будет первым!

Copyright 2016-2024 NeoChapay