Какова цель наследования QAbstractTableModel, QAbstractListModel, et c. для ListView, GridView и TableView - PullRequest
1 голос
/ 21 января 2020

Я мог бы иметь простой QVector, QList, et c. QObject для представления в ListView, GridView и TableView и добавления / редактирования / удаления элементов в / из этих View. Для меня, используя QVector, QList, et c. QObject* - это самый простой способ достижения sh конечной цели. Какая реальная выгода от наследования QAbstractTableModel, QAbstractListModel, et c.? В WPF у нас есть VirtualizingStackPanel и некоторые свойства для повышения производительности в таком типе View. Унаследовано ли это Abstract..Model для той же цели или иным образом (наследование или использование простого QVector/QList), производительность будет такой же?

1 Ответ

4 голосов
/ 22 января 2020

Преимуществами QAbstractItemModel и его подклассов являются, главным образом, повышение производительности при обработке больших списков и повышенная гибкость благодаря использованию прокси-моделей:

  1. Частичные обновления: модель может сообщать представлению, что отдельные строки или диапазоны строк были вставлены , перемещены , удалены или обновлены , на которые затем представление может действовать умнее, чем выбрасывать и восстановить все. Например, стоимость вставки элемента в середину из 10 тыс. Других предметов является дешевой.

  2. Меньшие накладные расходы: большой список, скажем, 50 тыс. Объектов QObject * будет иметь большие накладные расходы как в стоимости самих объектов, так и в обработке всех соединений сигнал / слот для обработки обновлений свойств.

  3. Модель может выступать в качестве адаптера к уже существующей структуре данных без необходимости хранить все данные в модели (хотя на практике это может быть сложно, чтобы гарантировать правильность / согласованность)

  4. отложенная загрузка: модель может загружать данные по требованию, когда пользователь перемещается по представлению, без необходимости иметь все данные уже доступны (см. fetchMore () / canFetchMore () ).

  5. Гибкость с помощью прокси: QAbstractProxyModel и подклассов (в частности, QSortFilterProxyModel ) позволяют укладывать модели в фильтровать / сортировать / изменять данные в исходной модели. С QSortFilterProxyModel сортировку и фильтрацию обычно гораздо проще реализовать (и без изменения исходных данных / модели), чем реализовать ее вручную для QList. Простые модификации, такие как изменение возвращаемых данных для определенной роли, могут быть реализованы путем создания подкласса QIdentityProxyModel .

  6. Более сложные структуры данных: QAbstractItemModel также допускает деревья (сложно реализовать хотя) и таблицы. Однако они чаще используются в «традиционных» (основанных на QWidget) пользовательских интерфейсах рабочего стола, чем во встроенных / мобильных сенсорных интерфейсах.

...