Отобразить список с вложенным в него еще одним списком
Доброго времени суток, В 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;
- }
- }
- }
- }
- }
Буду благодарен за помощь
2
99
Do you like it? Share on social networks!
- Last comments
- AKApril 1, 2025, 11:41 a.m.Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
- VPMarch 9, 2025, 4:14 p.m.Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
- ИМNov. 22, 2024, 9:51 p.m.Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
- Now discuss on the forum
- МАApril 1, 2025, 4:21 p.m.0ff763fe-4e50-455d-a3a6-5699c243b1a5_17_44_22_1.xml
- fFeb. 15, 2025, 1:46 p.m.Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
- Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
- Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
Добрый день
В этом случае самым адекватным решением, которое напрашивается само по себе, это попробовать возвращать вложенную модель вместо вектора, а в делегате ListElement родительской модели уже отображать вложенную модель ListModel
На данный момент придумал полумеру решения данного вопроса, сделать делегаты RadioDelegate внутри котороых вложенный Reapiter,
при checked отправляю во вложенную модель currentIndex. В результате вложенная модель при каждом клике переопределяется и выводит список соответсвующий данному делегату. Минусом данного подхода является, то что я не могу основываясь на вложеном списке выводить в главный список какую либо информацию (Например количество строк списка), так как при изменении модели вложенного списка он меняется во всех делегатах
Говоря "возвращать вложенную модель вместо вектора" вы имеете ввиду в методе data() установить роль возвращающую модель?
Да, я думаю, что стоит попробовать такое сделать. Были бы это классические виджеты, то именно это я бы и посоветовал, как наиболее адекватное решение, а с QML, наверное, будет посложнее из-за необходимости регистрации мета-типов... интересный вопрос сам по себе.
Если возможно, можете подсказать "правильный синтаксис" присвоения ролям значения модели? Мой вариант меня не до конца устраивает и я все же хотел бы выводить вложенный каждый список для всех делегатов одновреммено, так как значения Reapiter-ов я хотел бы использовать в главной моделе
Самому нужно подумать, с наскоку это не сделать, да из головы даже не знаю...