Отобразить список с вложенным в него еще одним списком
Доброго времени суток, В 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 г. 1:37
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:80баллов,
- Очки рейтинга4
- molni99
- 26 октября 2024 г. 1:29
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:20баллов,
- Очки рейтинга-10
Добрый день
В этом случае самым адекватным решением, которое напрашивается само по себе, это попробовать возвращать вложенную модель вместо вектора, а в делегате ListElement родительской модели уже отображать вложенную модель ListModel
На данный момент придумал полумеру решения данного вопроса, сделать делегаты RadioDelegate внутри котороых вложенный Reapiter,
при checked отправляю во вложенную модель currentIndex. В результате вложенная модель при каждом клике переопределяется и выводит список соответсвующий данному делегату. Минусом данного подхода является, то что я не могу основываясь на вложеном списке выводить в главный список какую либо информацию (Например количество строк списка), так как при изменении модели вложенного списка он меняется во всех делегатах
Говоря "возвращать вложенную модель вместо вектора" вы имеете ввиду в методе data() установить роль возвращающую модель?
Да, я думаю, что стоит попробовать такое сделать. Были бы это классические виджеты, то именно это я бы и посоветовал, как наиболее адекватное решение, а с QML, наверное, будет посложнее из-за необходимости регистрации мета-типов... интересный вопрос сам по себе.
Если возможно, можете подсказать "правильный синтаксис" присвоения ролям значения модели? Мой вариант меня не до конца устраивает и я все же хотел бы выводить вложенный каждый список для всех делегатов одновреммено, так как значения Reapiter-ов я хотел бы использовать в главной моделе
Самому нужно подумать, с наскоку это не сделать, да из головы даже не знаю...