в QML?
Накостылил ListView, который умеет показывать дочерние элементы для каждого элемента (по сути - это дерево с глубиной 2). Для отладки использовал модель в QML примерно такую:
ListModel {
ListElement {
foo: "hello"
bar: "lalala"
subItems: [
ListElement {...},
ListElement {...},
]
}
}
В ListView в делегате соответственно показываю ещё один ListView в котором моделью задаются subItems. Это работает, но теперь мне надо запилить полноценную динамическую модель в C++ и вот тут какая-то печаль. Как это лучше сделать?
В доке https://doc.qt.io/qt-5/qtquick-modelviewsdata-cppmodels.html#qabstractitemmodel-subclass
написано:
QAbstractItemModel presents a hierarchy of tables, but the views currently provided by QML can only display list data. In order to display the child lists of a hierarchical model, use the DelegateModel QML type, which provides the following properties and functions to be used with list models of QAbstractItemModel type
Посмотрел DelegateModel, ничего не понял, куда как это пихать, при чём тут С++. Допустим, сделаю я в С++ свою модель на базе QAbstractItemModel, а дальше что? Как это в QML использовать? Документация вообще немногословна.
я не использовал Qtшные родитель-дочерние индексы, а просто следил за состоянием каждого из столбцов
ну и сам по ролям спрашивал является ли строка/столбец шиной, если да, то в каком состоянии и тд
что то было. делал через ListView и Loader
У меня сворачивание строк сделано в моём View (делегате), там через Loader загружается другой ListView в который передаётся subItems Loader { id: subItemLoader visible: !column.collapsed sourceComponent: subListViewComponent } Я не очень понимаю как мне модель в C++ сделать, чтобы работать с ней в QML, чтобы использовать возможности иерархической С++ модели. Сейчас с моком в QML всё просто, subItems - это по сути роль, хранит просто список ListElement.
У меня тоже Loader используется, но я не догоняю как модель на базе QAbstractItemModel к этому прикрутить.
может по какому нибудь роле возвращать указатель на модель?
Я так хотел, типа роль subItems, пихаем в неё ещё один экземпляр модели. Но так не получится, там же QVariant, а в QVariant нельзя положить свою кастомную модель, потому что она наследуется от QObject
https://doc.qt.io/qt-5/qvariant.html#setValue — да наверное можно пихнуть в QVariant модель
Q_DECLARE_METATYPE(MyCustomModel) не сработает, не скомпилируется, потмоу что QObject не может быть скопирован.
А модель как делал?
у меня не было иерархической. была обычная list модель. а Loader так же загружал свою listView со своей моделью
А как доступ к этой суб-модели был организован? Через роль (поле) в родительской?
ну да, там делался запрос с выборкой по родителю. решение так себе в идеале надо смотреть как сделаны вьюшки в qml и городить свою treeView
Обсуждают сегодня