Отобразить список с вложенным в него еще одним списком
Доброго времени суток, В QML есть ListView моделью которого является QAbstractListModel в который из интерфейса для обращения к данным передаётся контейнер std::vector(родительский) c полями. Помимо простых типов данных в нем содержится вложенный контейнер std::vector(дочерний). Для того чтобы "показать" в QML элементы родительского контейнера требуется определить методы QAbstractListModel такие как:
rowCount( )
data( )
roleNames( )
А также создать Enum ролей
Для простых типов, таких как string, int, double нет ничего сложного
int DailyModel::rowCount(const QModelIndex &parent) const { Q_UNUSED(parent) return static_cast<int>(m_dailys.size()); } QVariant DailyModel::data(const QModelIndex &index, int role) const { if (!index.isValid() || index.row() > rowCount(index)) { return QVariant(); } const ns1__dayArc *daily = m_dailys.at(index.row()); switch (role) { case DailyRoles::TimeRole: { char buffer [80]; struct tm * timeinfo; timeinfo = localtime (daily->Time); strftime (buffer,80,"%d/%m/%y %X", timeinfo); return QString::fromStdString(buffer); } case DailyRoles::VbTRole: { return QVariant::fromValue(*daily->VbT); } case DailyRoles::StatusRole: { std::string arr=DailyModel::translator(daily->state); return QString::fromStdString(arr); } case DailyRoles::TRole: { return QVariant::fromValue(*daily->T); } case DailyRoles::K_smtRole: { return QVariant::fromValue(*daily->K_USCOREsmt); } default: { return {}; } } } QHash<int, QByteArray> DailyModel::roleNames() const { QHash<int, QByteArray> roles; roles[DailyRoles::TimeRole] = "time"; roles[DailyRoles::StatusRole] = "status"; roles[DailyRoles::VbTRole] = "VbT"; roles[DailyRoles::TRole] = "T"; roles[DailyRoles::K_smtRole] = "K_smt"; return roles; }
Но как мне задать роль для std::vector а также вывести его в делегате?
Хочется реализовать что-то подобное
import QtQuick 2.12 import QtQuick.Window 2.12 import QtQuick.Controls 2.5 Window { ListModel{ id: dataModel; ListElement{ color: "skyblue"; text: "one"; texts:[ ListElement{ text: "one_000"; }, ListElement{ text: "one_001"; }, ListElement{ text: "one_002"; } ] } ListElement{ color: "lightgreen"; text: "two"; texts:[ ListElement{ text: "two_000"; }, ListElement{ text: "two_001"; }, ListElement{ text: "two_002"; } ] } ListElement{ color: "orchid"; text: "three"; texts:[ ListElement{ text: "three_000"; }, ListElement{ text: "three_001"; }, ListElement{ text: "three_002"; } ] } } visible: true width: 640 height: 480 ListView{ id: view; anchors.fill: parent; anchors.margins: 10; spacing: 10; clip: true; model: dataModel; delegate: Rectangle{ width: view.width; height: 50; color: model.color; Row{ anchors.centerIn: parent; anchors.margins: 10; spacing: 10; Text{ renderType: Text.NativeRendering; font.pointSize: 15; text: model.text; } ComboBox{ model: texts; } } } } }
Буду благодарен за помощь
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.Вам це подобається? Поділіться в соціальних мережах!
- Akiv Doros
- 11 листопада 2024 р. 14:58
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:50бали,
- Рейтинг балів-4
- molni99
- 26 жовтня 2024 р. 01:37
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:80бали,
- Рейтинг балів4
- molni99
- 26 жовтня 2024 р. 01:29
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:20бали,
- Рейтинг балів-10
Добрый день
В этом случае самым адекватным решением, которое напрашивается само по себе, это попробовать возвращать вложенную модель вместо вектора, а в делегате ListElement родительской модели уже отображать вложенную модель ListModel
На данный момент придумал полумеру решения данного вопроса, сделать делегаты RadioDelegate внутри котороых вложенный Reapiter,
при checked отправляю во вложенную модель currentIndex. В результате вложенная модель при каждом клике переопределяется и выводит список соответсвующий данному делегату. Минусом данного подхода является, то что я не могу основываясь на вложеном списке выводить в главный список какую либо информацию (Например количество строк списка), так как при изменении модели вложенного списка он меняется во всех делегатах
Говоря "возвращать вложенную модель вместо вектора" вы имеете ввиду в методе data() установить роль возвращающую модель?
Да, я думаю, что стоит попробовать такое сделать. Были бы это классические виджеты, то именно это я бы и посоветовал, как наиболее адекватное решение, а с QML, наверное, будет посложнее из-за необходимости регистрации мета-типов... интересный вопрос сам по себе.
Если возможно, можете подсказать "правильный синтаксис" присвоения ролям значения модели? Мой вариант меня не до конца устраивает и я все же хотел бы выводить вложенный каждый список для всех делегатов одновреммено, так как значения Reapiter-ов я хотел бы использовать в главной моделе
Самому нужно подумать, с наскоку это не сделать, да из головы даже не знаю...