Класс QAbstractItemModel
Класс QAbstractItemModel предоставляет абстрактный интерфейс для классов моделей элементов. Подробнее...
| Заголовок: | #include <QAbstractItemModel> |
| CMake: | find_package(Qt6 COMPONENTS Core REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
| Наследуется от: | QObject |
| Наследуется: | QAbstractItemModelReplica, QAbstractListModel, QAbstractProxyModel, QAbstractTableModel, QConcatenateTablesProxyModel, QFileSystemModel, QHelpContentModel, и QStandardItemModel |
Открытые типы
| enum class | CheckIndexOption { NoOption, IndexIsValid, DoNotUseParent, ParentIsInvalid } |
| flags | CheckIndexOptions |
| enum | LayoutChangeHint { NoLayoutChangeHint, VerticalSortHint, HorizontalSortHint } |
Открытые функции
| QAbstractItemModel(QObject *parent = nullptr) | |
| virtual | ~QAbstractItemModel() |
| virtual QModelIndex | buddy(const QModelIndex &index) const |
| virtual bool | canDropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) const |
| virtual bool | canFetchMore(const QModelIndex &parent) const |
| bool | checkIndex(const QModelIndex &index, QAbstractItemModel::CheckIndexOptions options = CheckIndexOption::NoOption) const |
| virtual bool | clearItemData(const QModelIndex &index) |
| virtual int | columnCount(const QModelIndex &parent = QModelIndex()) const = 0 |
| virtual QVariant | data(const QModelIndex &index, int role = Qt::DisplayRole) const = 0 |
| virtual bool | dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) |
| virtual void | fetchMore(const QModelIndex &parent) |
| virtual Qt::ItemFlags | flags(const QModelIndex &index) const |
| virtual bool | hasChildren(const QModelIndex &parent = QModelIndex()) const |
| bool | hasIndex(int row, int column, const QModelIndex &parent = QModelIndex()) const |
| virtual QVariant | headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const |
| virtual QModelIndex | index(int row, int column, const QModelIndex &parent = QModelIndex()) const = 0 |
| bool | insertColumn(int column, const QModelIndex &parent = QModelIndex()) |
| virtual bool | insertColumns(int column, int count, const QModelIndex &parent = QModelIndex()) |
| bool | insertRow(int row, const QModelIndex &parent = QModelIndex()) |
| virtual bool | insertRows(int row, int count, const QModelIndex &parent = QModelIndex()) |
| virtual QMap<int, QVariant> | itemData(const QModelIndex &index) const |
| virtual QModelIndexList | match(const QModelIndex &start, int role, const QVariant &value, int hits = 1, Qt::MatchFlags flags = Qt::MatchFlags(Qt::MatchStartsWith|Qt::MatchWrap)) const |
| virtual QMimeData * | mimeData(const QModelIndexList &indexes) const |
| virtual QStringList | mimeTypes() const |
| bool | moveColumn(const QModelIndex &sourceParent, int sourceColumn, const QModelIndex &destinationParent, int destinationChild) |
| virtual bool | moveColumns(const QModelIndex &sourceParent, int sourceColumn, int count, const QModelIndex &destinationParent, int destinationChild) |
| bool | moveRow(const QModelIndex &sourceParent, int sourceRow, const QModelIndex &destinationParent, int destinationChild) |
| virtual bool | moveRows(const QModelIndex &sourceParent, int sourceRow, int count, const QModelIndex &destinationParent, int destinationChild) |
| virtual void | multiData(const QModelIndex &index, QModelRoleDataSpan roleDataSpan) const |
| virtual QModelIndex | parent(const QModelIndex &index) const = 0 |
| bool | removeColumn(int column, const QModelIndex &parent = QModelIndex()) |
| virtual bool | removeColumns(int column, int count, const QModelIndex &parent = QModelIndex()) |
| bool | removeRow(int row, const QModelIndex &parent = QModelIndex()) |
| virtual bool | removeRows(int row, int count, const QModelIndex &parent = QModelIndex()) |
| virtual QHash<int, QByteArray> | roleNames() const |
| virtual int | rowCount(const QModelIndex &parent = QModelIndex()) const = 0 |
| virtual bool | setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) |
| virtual bool | setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role = Qt::EditRole) |
| virtual bool | setItemData(const QModelIndex &index, const QMap<int, QVariant> &roles) |
| virtual QModelIndex | sibling(int row, int column, const QModelIndex &index) const |
| virtual void | sort(int column, Qt::SortOrder order = Qt::AscendingOrder) |
| virtual QSize | span(const QModelIndex &index) const |
| virtual Qt::DropActions | supportedDragActions() const |
| virtual Qt::DropActions | supportedDropActions() const |
Открытые слоты
| virtual void | revert() |
| virtual bool | submit() |
Сигналы
| void | columnsAboutToBeInserted(const QModelIndex &parent, int first, int last) |
| void | columnsAboutToBeMoved(const QModelIndex &sourceParent, int sourceStart, int sourceEnd, const QModelIndex &destinationParent, int destinationColumn) |
| void | columnsAboutToBeRemoved(const QModelIndex &parent, int first, int last) |
| void | columnsInserted(const QModelIndex &parent, int first, int last) |
| void | columnsMoved(const QModelIndex &parent, int start, int end, const QModelIndex &destination, int column) |
| void | columnsRemoved(const QModelIndex &parent, int first, int last) |
| void | dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QList<int> &roles = QList<int>()) |
| void | headerDataChanged(Qt::Orientation orientation, int first, int last) |
| void | layoutAboutToBeChanged(const QList<QPersistentModelIndex> &parents = QList<QPersistentModelIndex>(), QAbstractItemModel::LayoutChangeHint hint = QAbstractItemModel::NoLayoutChangeHint) |
| void | layoutChanged(const QList<QPersistentModelIndex> &parents = QList<QPersistentModelIndex>(), QAbstractItemModel::LayoutChangeHint hint = QAbstractItemModel::NoLayoutChangeHint) |
| void | modelAboutToBeReset() |
| void | modelReset() |
| void | rowsAboutToBeInserted(const QModelIndex &parent, int start, int end) |
| void | rowsAboutToBeMoved(const QModelIndex &sourceParent, int sourceStart, int sourceEnd, const QModelIndex &destinationParent, int destinationRow) |
| void | rowsAboutToBeRemoved(const QModelIndex &parent, int first, int last) |
| void | rowsInserted(const QModelIndex &parent, int first, int last) |
| void | rowsMoved(const QModelIndex &parent, int start, int end, const QModelIndex &destination, int row) |
| void | rowsRemoved(const QModelIndex &parent, int first, int last) |
Защищенные функции
| void | beginInsertColumns(const QModelIndex &parent, int first, int last) |
| void | beginInsertRows(const QModelIndex &parent, int first, int last) |
| bool | beginMoveColumns(const QModelIndex &sourceParent, int sourceFirst, int sourceLast, const QModelIndex &destinationParent, int destinationChild) |
| bool | beginMoveRows(const QModelIndex &sourceParent, int sourceFirst, int sourceLast, const QModelIndex &destinationParent, int destinationChild) |
| void | beginRemoveColumns(const QModelIndex &parent, int first, int last) |
| void | beginRemoveRows(const QModelIndex &parent, int first, int last) |
| void | beginResetModel() |
| void | changePersistentIndex(const QModelIndex &from, const QModelIndex &to) |
| void | changePersistentIndexList(const QModelIndexList &from, const QModelIndexList &to) |
| QModelIndex | createIndex(int row, int column, const void *ptr = nullptr) const |
| QModelIndex | createIndex(int row, int column, quintptr id) const |
| void | endInsertColumns() |
| void | endInsertRows() |
| void | endMoveColumns() |
| void | endMoveRows() |
| void | endRemoveColumns() |
| void | endRemoveRows() |
| void | endResetModel() |
| QModelIndexList | persistentIndexList() const |
Защищенные слоты
| virtual void | resetInternalData() |
Подробное описание
Класс QAbstractItemModel определяет стандартный интерфейс, который модели элементов должны использовать для взаимодействия с другими компонентами в архитектуре модель/представление. Его не предполагается создавать напрямую. Вместо этого вы должны создать его подкласс для создания новых моделей.
Класс QAbstractItemModel является одним из классов Модель/Представление и является частью фреймворка модель/представление Qt. Он может использоваться в качестве базовой модели данных для элементов представления элементов в QML или классов представления элементов в модуле Qt Widgets.
Если вам нужна модель для использования с представлением элементов, таким как элемент List View в QML или виджеты C++ QListView или QTableView, вы должны рассмотреть возможность создания подкласса QAbstractListModel или QAbstractTableModel вместо этого класса.
Базовая модель данных предоставляется представлениям и делегатам как иерархия таблиц. Если вы не используете иерархию, то модель представляет собой простую таблицу строк и столбцов. Каждый элемент имеет уникальный индекс, заданный с помощью QModelIndex.
Каждый элемент данных, доступный через модель, имеет связанный индекс модели. Вы можете получить этот индекс модели, используя функцию index(). Каждый индекс может иметь индекс sibling(); дочерние элементы имеют индекс parent().
Каждый элемент имеет ряд связанных с ним элементов данных, и их можно получить, указав роль (см. Qt::ItemDataRole) функции data() модели. Данные для всех доступных ролей можно получить одновременно с помощью функции itemData().
Данные для каждой роли устанавливаются с помощью определенного Qt::ItemDataRole. Данные для отдельных ролей устанавливаются индивидуально с помощью setData(), или они могут быть установлены для всех ролей с помощью setItemData().
Элементы можно запрашивать с помощью flags() (см. Qt::ItemFlag), чтобы узнать, можно ли их выбрать, перетащить или изменить другими способами.
Если элемент имеет дочерние объекты, hasChildren() возвращает true для соответствующего индекса.
Модель имеет rowCount() и columnCount() для каждого уровня иерархии. Строки и столбцы можно вставлять и удалять с помощью insertRows(), insertColumns(), removeRows() и removeColumns().
Модель испускает сигналы для указания изменений. Например, dataChanged() испускается всякий раз, когда изменяются элементы данных, предоставляемые моделью. Изменения в заголовках, предоставляемых моделью, приводят к испусканию сигнала headerDataChanged(). Если структура базовых данных изменяется, модель может испустить layoutChanged(), чтобы указать любым присоединенным представлениям, что они должны перерисовать отображаемые элементы, учитывая новую структуру.
Доступные через модель элементы можно искать по определенным данным, используя функцию match().
Для сортировки модели можно использовать sort().
Наследование
Примечание: Некоторые общие рекомендации по созданию подклассов моделей доступны в Справочнике по созданию подклассов моделей.
При создании подкласса QAbstractItemModel, как минимум, необходимо реализовать index(), parent(), rowCount(), columnCount() и data(). Эти функции используются во всех моделях только для чтения и образуют основу редактируемых моделей.
Вы также можете переопределить hasChildren(), чтобы обеспечить специальное поведение для моделей, где реализация rowCount() является дорогостоящей. Это позволяет моделям ограничивать объем данных, запрашиваемых представлениями, и может использоваться как способ реализации ленивой загрузки данных модели.
Чтобы включить редактирование в вашей модели, вы также должны реализовать setData() и переопределить flags(), чтобы гарантировать, что возвращается ItemIsEditable. Вы также можете переопределить headerData() и setHeaderData() для управления способом представления заголовков вашей модели.
Сигналы dataChanged() и headerDataChanged() должны явно испускаться при переопределении функций setData() и setHeaderData() соответственно.
Пользовательские модели должны создавать индексы модели для использования другими компонентами. Для этого вызовите createIndex() с подходящими номерами строк и столбцов для элемента и идентификатором для него, либо как указатель, либо как целое значение. Сочетание этих значений должно быть уникальным для каждого элемента. Пользовательские модели обычно используют эти уникальные идентификаторы в других переопределенных функциях для извлечения данных элемента и доступа к информации о родительских и дочерних элементах. См. пример Простой пример модели дерева для получения дополнительной информации об уникальных идентификаторах.
Не обязательно поддерживать каждую роль, определенную в Qt::ItemDataRole. В зависимости от типа данных, содержащихся в модели, может быть полезно реализовать функцию data() только для возврата достоверной информации для некоторых из наиболее распространенных ролей. Большинство моделей предоставляют по крайней мере текстовое представление данных элемента для Qt::DisplayRole, а корректно работающие модели также должны предоставлять достоверную информацию для Qt::ToolTipRole и Qt::WhatsThisRole. Поддержка этих ролей позволяет использовать модели со стандартными представлениями Qt. Однако для некоторых моделей, работающих с высокоспециализированными данными, может быть целесообразно предоставлять данные только для определяемых пользователем ролей.
Модели, предоставляющие интерфейсы для изменяемых структур данных, могут предоставлять реализации insertRows(), removeRows(), insertColumns() и removeColumns(). При реализации этих функций важно уведомить все подключенные представления об изменениях размеров модели как до, так и после их возникновения:
- Реализация insertRows() должна вызывать beginInsertRows() перед вставкой новых строк в структуру данных и endInsertRows() сразу после.
- Реализация insertColumns() должна вызывать beginInsertColumns() перед вставкой новых столбцов в структуру данных и endInsertColumns() сразу после.
- Реализация removeRows() должна вызывать beginRemoveRows() перед удалением строк из структуры данных и endRemoveRows() сразу после.
- Реализация removeColumns() должна вызывать beginRemoveColumns() перед удалением столбцов из структуры данных и endRemoveColumns() сразу после.
Приватные сигналы, которые испускают эти функции, предоставляют присоединенным компонентам возможность предпринять действия, прежде чем какие-либо данные станут недоступными. Инкапсуляция операций вставки и удаления с помощью этих функций begin и end также позволяет модели правильно управлять постоянными индексами модели. Если вы хотите, чтобы выделение обрабатывалось правильно, вы должны убедиться, что вы вызываете эти функции. Если вы вставляете или удаляете элемент с дочерними элементами, вам не нужно вызывать эти функции для дочерних элементов. Другими словами, родительский элемент позаботится о своих дочерних элементах.
Для создания моделей, которые заполняются инкрементно, можно переопределить fetchMore() и canFetchMore(). Если переопределение fetchMore() добавляет строки в модель, необходимо вызвать beginInsertRows() и endInsertRows().
См. также Классы моделей, Справочник по созданию подклассов моделей, QModelIndex, QAbstractItemView, Использование перетаскивания с представлениями элементов, Простой пример модели DOM, Простой пример модели дерева, Пример редактируемой модели дерева и Пример Fetch More.
Документация по типам членов
[since 5.11] enum class QAbstractItemModel::CheckIndexOptionflags QAbstractItemModel::CheckIndexOptions
Это перечисление можно использовать для управления проверками, выполняемыми QAbstractItemModel::checkIndex().
| Константа | Значение | Описание |
|---|---|---|
QAbstractItemModel::CheckIndexOption::NoOption |
0x0000 |
Параметры проверки не указаны. |
QAbstractItemModel::CheckIndexOption::IndexIsValid |
0x0001 |
Индекс модели, переданный в QAbstractItemModel::checkIndex(), проверяется как допустимый индекс модели. |
QAbstractItemModel::CheckIndexOption::DoNotUseParent |
0x0002 |
Не выполняет никаких проверок, связанных с использованием родительского элемента индекса, переданного в QAbstractItemModel::checkIndex(). |
QAbstractItemModel::CheckIndexOption::ParentIsInvalid |
0x0004 |
Родительский элемент индекса модели, переданного в QAbstractItemModel::checkIndex(), проверяется как недопустимый индекс модели. Если указаны как этот параметр, так и DoNotUseParent, то этот параметр игнорируется. |
Это перечисление было введено или изменено в Qt 5.11.
Тип CheckIndexOptions является typedef для QFlags<CheckIndexOption>. Он хранит объединенное ИЛИ значений CheckIndexOption.
enum QAbstractItemModel::LayoutChangeHint
Это перечисление описывает способ изменения макета модели.
| Константа | Значение | Описание |
|---|---|---|
QAbstractItemModel::NoLayoutChangeHint |
0 |
Подсказка недоступна. |
QAbstractItemModel::VerticalSortHint |
1 |
Строки сортируются. |
QAbstractItemModel::HorizontalSortHint |
2 |
Столбцы сортируются. |
Обратите внимание, что VerticalSortHint и HorizontalSortHint означают, что элементы перемещаются внутри одного и того же родительского элемента, а не перемещаются к другому родителю в модели, и не фильтруются.
Документация по функциям-членам
QAbstractItemModel::QAbstractItemModel(QObject *parent = nullptr)
Конструирует абстрактную модель элементов с заданным parent.
[private signal] void QAbstractItemModel::columnsAboutToBeInserted(const QModelIndex &parent, int first, int last)
Этот сигнал испускается непосредственно перед добавлением столбцов в модель. Новые элементы будут расположены между first и last включительно, под заданным элементом parent.
Примечание: Компоненты, подключенные к этому сигналу, используют его для адаптации к изменениям размеров модели. Он может быть испущен только реализацией QAbstractItemModel и не может быть явно испущен в коде подкласса.
Примечание: Это закрытый сигнал. Он может использоваться в соединениях сигналов, но не может быть испущен пользователем.
См. также insertColumns() и beginInsertColumns().
[private signal] void QAbstractItemModel::columnsAboutToBeMoved(const QModelIndex &sourceParent, int sourceStart, int sourceEnd, const QModelIndex &destinationParent, int destinationColumn)
Этот сигнал испускается непосредственно перед перемещением столбцов внутри модели. Элементы, которые будут перемещены, находятся между sourceStart и sourceEnd включительно, под заданным элементом sourceParent. Они будут перемещены в destinationParent, начиная со столбца destinationColumn.
Примечание: Компоненты, подключенные к этому сигналу, используют его для адаптации к изменениям размеров модели. Он может быть испущен только реализацией QAbstractItemModel и не может быть явно испущен в коде подкласса.
Примечание: Это закрытый сигнал. Он может использоваться в соединениях сигналов, но не может быть испущен пользователем.
См. также beginMoveRows().
[private signal] void QAbstractItemModel::columnsAboutToBeRemoved(const QModelIndex &parent, int first, int last)
Этот сигнал испускается непосредственно перед удалением столбцов из модели. Элементы, которые будут удалены, находятся между first и last включительно, под заданным элементом parent.
Примечание: Компоненты, подключенные к этому сигналу, используют его для адаптации к изменениям размеров модели. Он может быть испущен только реализацией QAbstractItemModel и не может быть явно испущен в коде подкласса.
Примечание: Это закрытый сигнал. Он может использоваться в соединениях сигналов, но не может быть испущен пользователем.
См. также removeColumns() и beginRemoveColumns().
[private signal] void QAbstractItemModel::columnsInserted(const QModelIndex &parent, int first, int last)
Этот сигнал испускается после добавления столбцов в модель. Новые элементы находятся между first и last включительно, под заданным элементом parent.
Примечание: Компоненты, подключенные к этому сигналу, используют его для адаптации к изменениям размеров модели. Он может быть испущен только реализацией QAbstractItemModel и не может быть явно испущен в коде подкласса.
Примечание: Это закрытый сигнал. Он может использоваться в соединениях сигналов, но не может быть испущен пользователем.
См. также insertColumns() и beginInsertColumns().
[private signal] void QAbstractItemModel::columnsMoved(const QModelIndex &parent, int start, int end, const QModelIndex &destination, int column)
Этот сигнал испускается после перемещения столбцов внутри модели. Элементы между start и end включительно, под заданным элементом parent, были перемещены в destination, начиная со столбца column.
Примечание: Компоненты, подключенные к этому сигналу, используют его для адаптации к изменениям размеров модели. Он может быть испущен только реализацией QAbstractItemModel и не может быть явно испущен в коде подкласса.
Примечание: Это закрытый сигнал. Он может использоваться в соединениях сигналов, но не может быть испущен пользователем.
См. также beginMoveRows().
[private signal] void QAbstractItemModel::columnsRemoved(const QModelIndex &parent, int first, int last)
Этот сигнал испускается после удаления столбцов из модели. Удаленные элементы находятся между first и last включительно, под заданным элементом parent.
Примечание: Компоненты, подключенные к этому сигналу, используют его для адаптации к изменениям размеров модели. Он может быть испущен только реализацией QAbstractItemModel и не может быть явно испущен в коде подкласса.
Примечание: Это закрытый сигнал. Он может использоваться в соединениях сигналов, но не может быть испущен пользователем.
См. также removeColumns() и beginRemoveColumns().
[signal] void QAbstractItemModel::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QList<int> &roles = QList<int>())
Этот сигнал испускается всякий раз, когда изменяются данные в существующем элементе.
Если элементы имеют одного и того же родителя, то затронутыми являются элементы между topLeft и bottomRight включительно. Если элементы не имеют одного и того же родителя, поведение не определено.
При переопределении функции setData() этот сигнал должен быть явно испущен.
Необязательный аргумент roles может использоваться для указания того, какие роли данных были фактически изменены. Пустой вектор в аргументе roles означает, что все роли должны считаться измененными. Порядок элементов в аргументе roles не имеет никакого значения.
См. также headerDataChanged(), setData() и layoutChanged().
[signal] void QAbstractItemModel::headerDataChanged(Qt::Orientation orientation, int first, int last)
Этот сигнал испускается всякий раз, когда изменяется заголовок. orientation указывает, изменился ли горизонтальный или вертикальный заголовок. Разделы в заголовке от first до last необходимо обновить.
При переопределении функции setHeaderData() этот сигнал должен быть явно испущен.
Если вы изменяете количество столбцов или строк, вам не нужно испускать этот сигнал, но используйте функции begin/end (см. раздел о наследовании в описании класса QAbstractItemModel для получения подробной информации).
См. также headerData(), setHeaderData() и dataChanged().
[signal, since 5.0] void QAbstractItemModel::layoutAboutToBeChanged(const QList<QPersistentModelIndex> &parents = QList<QPersistentModelIndex>(), QAbstractItemModel::LayoutChangeHint hint = QAbstractItemModel::NoLayoutChangeHint)
Этот сигнал испускается непосредственно перед изменением компоновки модели. Компоненты, подключенные к этому сигналу, используют его для адаптации к изменениям компоновки модели.
Подклассы должны обновлять любые постоянные индексы модели после испускания layoutAboutToBeChanged().
Необязательный параметр parents используется для предоставления более конкретного уведомления о том, какие части компоновки модели изменяются. Пустой список указывает на изменение компоновки всей модели. Порядок элементов в списке parents не имеет значения. Необязательный параметр hint используется для подсказки о том, что происходит во время перекомпоновки модели.
Эта функция была добавлена в Qt 5.0.
См. также layoutChanged() и changePersistentIndex().
[signal, since 5.0] void QAbstractItemModel::layoutChanged(const QList<QPersistentModelIndex> &parents = QList<QPersistentModelIndex>(), QAbstractItemModel::LayoutChangeHint hint = QAbstractItemModel::NoLayoutChangeHint)
Этот сигнал испускается всякий раз, когда изменяется макет элементов, предоставляемых моделью; например, когда модель была отсортирована. Когда этот сигнал принимается представлением, оно должно обновить макет элементов, чтобы отразить это изменение.
При создании подкласса QAbstractItemModel или QAbstractProxyModel, убедитесь, что вы испускаете layoutAboutToBeChanged() перед изменением порядка элементов или изменением структуры данных, которые вы предоставляете представлениям, и испускаете layoutChanged() после изменения макета.
Необязательный параметр parents используется для предоставления более конкретного уведомления о том, какие части макета модели изменяются. Пустой список указывает на изменение макета всей модели. Порядок элементов в списке parents не имеет значения. Необязательный параметр hint используется для предоставления подсказки о том, что происходит, пока модель перестраивается.
Подклассы должны обновить любые постоянные индексы модели перед испусканием layoutChanged(). Другими словами, когда структура изменяется:
- испустить layoutAboutToBeChanged
- Запомнить QModelIndex, который изменится
- Обновить ваши внутренние данные
- Вызвать changePersistentIndex()
- испустить layoutChanged
Эта функция была введена в Qt 5.0.
См. также layoutAboutToBeChanged(), dataChanged(), headerDataChanged(), modelReset(), и changePersistentIndex().
[private signal] void QAbstractItemModel::modelAboutToBeReset()
Этот сигнал испускается, когда вызывается beginResetModel(), до того, как внутреннее состояние модели (например, постоянные индексы модели) было признано недействительным.
Примечание: Это закрытый сигнал. Он может использоваться в соединениях сигналов, но не может быть испущен пользователем.
См. также beginResetModel() и modelReset().
[private signal] void QAbstractItemModel::modelReset()
Этот сигнал испускается, когда вызывается endResetModel(), после того, как внутреннее состояние модели (например, постоянные индексы модели) было признано недействительным.
Обратите внимание, что если модель сброшена, следует считать, что вся информация, ранее полученная из нее, недействительна. Это включает, помимо прочего, rowCount() и columnCount(), flags(), данные, полученные через data(), и roleNames().
Примечание: Это закрытый сигнал. Он может использоваться в соединениях сигналов, но не может быть испущен пользователем.
См. также endResetModel() и modelAboutToBeReset().
[virtual protected slot] void QAbstractItemModel::resetInternalData()
Этот слот вызывается сразу после очистки внутренних данных модели во время ее сброса.
Этот слот предоставляет удобство подклассам конкретных прокси-моделей, таких как подклассы QSortFilterProxyModel, которые поддерживают дополнительные данные.
class CustomDataProxy : public QSortFilterProxyModel
{
Q_OBJECT
public:
CustomDataProxy(QObject *parent)
: QSortFilterProxyModel(parent)
{
}
...
QVariant data(const QModelIndex &index, int role) override
{
if (role != Qt::BackgroundRole)
return QSortFilterProxyModel::data(index, role);
if (m_customData.contains(index.row()))
return m_customData.value(index.row());
return QSortFilterProxyModel::data(index, role);
}
private slots:
void resetInternalData()
{
m_customData.clear();
}
private:
QHash<int, QVariant> m_customData;
}; Примечание: Из-за ошибки этого слота не хватает в Qt 5.0.
См. также modelAboutToBeReset() и modelReset().
[virtual slot] void QAbstractItemModel::revert()
Сообщает модели, что она должна отбросить кэшированную информацию. Эта функция обычно используется для редактирования строк.
См. также submit().
[private signal] void QAbstractItemModel::rowsAboutToBeInserted(const QModelIndex &parent, int start, int end)
Этот сигнал испускается непосредственно перед вставкой строк в модель. Новые элементы будут расположены между start и end включительно, под заданным элементом parent.
Примечание: Компоненты, подключенные к этому сигналу, используют его для адаптации к изменениям размеров модели. Он может быть испущен только реализацией QAbstractItemModel и не может быть явно испущен в коде подкласса.
Примечание: Это закрытый сигнал. Он может использоваться в соединениях сигналов, но не может быть испущен пользователем.
См. также insertRows() и beginInsertRows().
[private signal] void QAbstractItemModel::rowsAboutToBeMoved(const QModelIndex &sourceParent, int sourceStart, int sourceEnd, const QModelIndex &destinationParent, int destinationRow)
Этот сигнал испускается непосредственно перед перемещением строк в модели. Элементы, которые будут перемещены, находятся между sourceStart и sourceEnd включительно, под заданным элементом sourceParent. Они будут перемещены в destinationParent, начиная со строки destinationRow.
Примечание: Компоненты, подключенные к этому сигналу, используют его для адаптации к изменениям размеров модели. Он может быть испущен только реализацией QAbstractItemModel и не может быть явно испущен в коде подкласса.
Примечание: Это закрытый сигнал. Он может использоваться в соединениях сигналов, но не может быть испущен пользователем.
См. также beginMoveRows().
[private signal] void QAbstractItemModel::rowsAboutToBeRemoved(const QModelIndex &parent, int first, int last)
Этот сигнал испускается непосредственно перед удалением строк из модели. Элементы, которые будут удалены, находятся между first и last включительно, под заданным элементом parent.
Примечание: Компоненты, подключенные к этому сигналу, используют его для адаптации к изменениям размеров модели. Он может быть испущен только реализацией QAbstractItemModel и не может быть явно испущен в коде подкласса.
Примечание: Это закрытый сигнал. Он может использоваться в соединениях сигналов, но не может быть испущен пользователем.
См. также removeRows() и beginRemoveRows().
[private signal] void QAbstractItemModel::rowsInserted(const QModelIndex &parent, int first, int last)
Этот сигнал испускается после вставки строк в модель. Новые элементы находятся между first и last включительно, под заданным элементом parent.
Примечание: Компоненты, подключенные к этому сигналу, используют его для адаптации к изменениям размеров модели. Он может быть испущен только реализацией QAbstractItemModel и не может быть явно испущен в коде подкласса.
Примечание: Это закрытый сигнал. Он может использоваться в соединениях сигналов, но не может быть испущен пользователем.
См. также insertRows() и beginInsertRows().
[private signal] void QAbstractItemModel::rowsMoved(const QModelIndex &parent, int start, int end, const QModelIndex &destination, int row)
Этот сигнал испускается после перемещения строк в модели. Элементы между start и end включительно, под заданным элементом parent, были перемещены в destination, начиная со строки row.
Примечание: Компоненты, подключенные к этому сигналу, используют его для адаптации к изменениям размеров модели. Он может быть испущен только реализацией QAbstractItemModel и не может быть явно испущен в коде подкласса.
Примечание: Это закрытый сигнал. Он может использоваться в соединениях сигналов, но не может быть испущен пользователем.
См. также beginMoveRows().
[private signal] void QAbstractItemModel::rowsRemoved(const QModelIndex &parent, int first, int last)
Этот сигнал испускается после удаления строк из модели. Удаленные элементы находятся между first и last включительно, под заданным элементом parent.
Примечание: Компоненты, подключенные к этому сигналу, используют его для адаптации к изменениям размеров модели. Он может быть испущен только реализацией QAbstractItemModel и не может быть явно испущен в коде подкласса.
Примечание: Это закрытый сигнал. Он может использоваться в соединениях сигналов, но не может быть испущен пользователем.
См. также removeRows() и beginRemoveRows().
[virtual slot] bool QAbstractItemModel::submit()
Сообщает модели, что она должна отправить кэшированную информацию в постоянное хранилище. Эта функция обычно используется для редактирования строк.
Возвращает true если нет ошибок; в противном случае возвращает false.
См. также revert().
[virtual] QAbstractItemModel::~QAbstractItemModel()
Уничтожает абстрактную модель элемента.
[protected] void QAbstractItemModel::beginInsertColumns(const QModelIndex &parent, int first, int last)
Начинает операцию вставки столбца.
При переопределении insertColumns() в подклассе, вы должны вызвать эту функцию перед вставкой данных в базовое хранилище данных модели.
Индекс parent соответствует родителю, в который вставляются новые столбцы; first и last — это номера столбцов, которые будут иметь новые столбцы после их вставки.
| Укажите номера первого и последнего столбцов для диапазона столбцов, которые вы хотите вставить в элемент модели. Например, как показано на диаграмме, мы вставляем три столбца перед столбцом 4, поэтому first равно 4, а last равно 6: beginInsertColumns(parent, 4, 6); Это вставляет три новых столбца как столбцы 4, 5 и 6. |
|
| Чтобы добавить столбцы, вставьте их после последнего столбца. Например, как показано на диаграмме, мы добавляем три столбца к коллекции из шести существующих столбцов (заканчивающихся столбцом 5), поэтому first равно 6, а last равно 8: beginInsertColumns(parent, 6, 8); Это добавляет два новых столбца как столбцы 6, 7 и 8. |
Примечание: Эта функция испускает сигнал columnsAboutToBeInserted(), который подключенные представления (или прокси) должны обрабатывать до вставки данных. В противном случае представления могут оказаться в неверном состоянии.
См. также endInsertColumns().
[protected] void QAbstractItemModel::beginInsertRows(const QModelIndex &parent, int first, int last)
Начинает операцию вставки строки.
При переопределении insertRows() в подклассе, вы должны вызвать эту функцию перед вставкой данных в базовое хранилище данных модели.
Индекс parent соответствует родителю, в который вставляются новые строки; first и last — это номера строк, которые будут иметь новые строки после их вставки.
| Укажите номера первой и последней строки для диапазона строк, которые вы хотите вставить в элемент модели. Например, как показано на диаграмме, мы вставляем три строки перед строкой 2, поэтому first равно 2, а last равно 4: beginInsertRows(parent, 2, 4); Это вставляет три новые строки как строки 2, 3 и 4. |
|
| Чтобы добавить строки, вставьте их после последней строки. Например, как показано на диаграмме, мы добавляем две строки к коллекции из 4 существующих строк (заканчивающихся строкой 3), поэтому first равно 4, а last равно 5: beginInsertRows(parent, 4, 5); Это добавляет две новые строки как строки 4 и 5. |
Примечание: Эта функция испускает сигнал rowsAboutToBeInserted(), который подключенные представления (или прокси) должны обрабатывать до вставки данных. В противном случае представления могут оказаться в неверном состоянии.
См. также endInsertRows().
[protected] bool QAbstractItemModel::beginMoveColumns(const QModelIndex &sourceParent, int sourceFirst, int sourceLast, const QModelIndex &destinationParent, int destinationChild)
Начинает операцию перемещения столбца.
При переопределении в подклассе этот метод упрощает перемещение сущностей в вашей модели. Этот метод отвечает за перемещение постоянных индексов в модели, что в противном случае вам пришлось бы делать самостоятельно. Использование beginMoveColumns и endMoveColumns является альтернативой прямому испусканию сигналов layoutAboutToBeChanged и layoutChanged вместе с changePersistentIndex.
Индекс sourceParent соответствует родителю, из которого перемещаются столбцы; sourceFirst и sourceLast — это номера первого и последнего столбцов, которые нужно переместить. Индекс destinationParent соответствует родителю, в который перемещаются эти столбцы. destinationChild — это столбец, в который будут перемещены столбцы. То есть индекс в столбце sourceFirst в sourceParent станет столбцом destinationChild в destinationParent, за которым последуют все остальные столбцы до sourceLast.
Однако при перемещении столбцов вниз в том же родителе (sourceParent и destinationParent равны) столбцы будут размещены перед индексом destinationChild. То есть, если вы хотите переместить столбцы 0 и 1 так, чтобы они стали столбцами 1 и 2, destinationChild должен быть равен 3. В этом случае новый индекс для исходного столбца i (который находится между sourceFirst и sourceLast) равен (destinationChild-sourceLast-1+i).
Обратите внимание, что если sourceParent и destinationParent одинаковы, вы должны убедиться, что destinationChild не находится в диапазоне от sourceFirst до sourceLast + 1. Вы также должны убедиться, что вы не пытаетесь переместить столбец в один из его собственных дочерних элементов или предков. Этот метод возвращает false , если выполняется одно из этих условий, в этом случае вы должны прервать операцию перемещения.
См. также endMoveColumns().
[protected] bool QAbstractItemModel::beginMoveRows(const QModelIndex &sourceParent, int sourceFirst, int sourceLast, const QModelIndex &destinationParent, int destinationChild)
Начинает операцию перемещения строки.
При переопределении в подклассе этот метод упрощает перемещение сущностей в вашей модели. Этот метод отвечает за перемещение постоянных индексов в модели, что в противном случае вам пришлось бы делать самостоятельно. Использование beginMoveRows и endMoveRows является альтернативой прямому испусканию сигналов layoutAboutToBeChanged и layoutChanged вместе с changePersistentIndex.
Индекс sourceParent соответствует родителю, из которого перемещаются строки; sourceFirst и sourceLast — это номера первой и последней строки, которые нужно переместить. Индекс destinationParent соответствует родителю, в который перемещаются эти строки. destinationChild — это строка, в которую будут перемещены строки. То есть индекс в строке sourceFirst в sourceParent станет строкой destinationChild в destinationParent, за которым последуют все остальные строки до sourceLast.
Однако при перемещении строк вниз в том же родителе (sourceParent и destinationParent равны) строки будут размещены перед индексом destinationChild. То есть, если вы хотите переместить строки 0 и 1 так, чтобы они стали строками 1 и 2, destinationChild должен быть равен 3. В этом случае новый индекс для исходной строки i (которая находится между sourceFirst и sourceLast) равен (destinationChild-sourceLast-1+i).
Обратите внимание, что если sourceParent и destinationParent одинаковы, вы должны убедиться, что destinationChild не находится в диапазоне от sourceFirst до sourceLast + 1. Вы также должны убедиться, что вы не пытаетесь переместить строку в один из её собственных дочерних элементов или предков. Этот метод возвращает false , если выполняется одно из этих условий, в этом случае вы должны прервать операцию перемещения.
| Укажите номера первой и последней строки для диапазона строк в исходном родителе, который вы хотите переместить в модели. Также укажите строку в целевом родителе, куда нужно переместить диапазон. Например, как показано на диаграмме, мы перемещаем три строки со строки 2 по 4 в источнике, поэтому sourceFirst равно 2, а sourceLast равно 4. Мы перемещаем эти элементы над строкой 2 в назначении, поэтому destinationChild равно 2. beginMoveRows(sourceParent, 2, 4, destinationParent, 2); Это перемещает три строки 2, 3 и 4 в источнике, чтобы они стали 2, 3 и 4 в назначении. Другие затронутые братья и сёстры смещаются соответственно. |
|
| Чтобы добавить строки к другому родителю, переместите их после последней строки. Например, как показано на диаграмме, мы перемещаем три строки к коллекции из 6 существующих строк (заканчивающихся строкой 5), поэтому destinationChild равно 6: beginMoveRows(sourceParent, 2, 4, destinationParent, 6); Это перемещает целевые строки в конец целевого родителя как 6, 7 и 8. |
|
| Чтобы переместить строки в пределах одного родителя, укажите строку, в которую нужно их переместить. Например, как показано на диаграмме, мы перемещаем один элемент со строки 2 на строку 0, поэтому sourceFirst и sourceLast равны 2, а destinationChild равно 0. beginMoveRows(parent, 2, 2, parent, 0); Обратите внимание, что другие строки могут быть смещены соответственно. Обратите также внимание, что при перемещении элементов внутри одного родителя не следует пытаться выполнять недопустимые или бездействующие перемещения. В приведенном выше примере элемент 2 находится в строке 2 до перемещения, поэтому его нельзя переместить в строку 2 (где он уже находится) или строку 3 (бездействие, так как строка 3 означает выше строки 3, где он уже находится). |
|
| Чтобы переместить строки в пределах одного родителя, укажите строку, в которую нужно их переместить. Например, как показано на диаграмме, мы перемещаем один элемент со строки 2 на строку 4, поэтому sourceFirst и sourceLast равны 2, а destinationChild равно 4. beginMoveRows(parent, 2, 2, parent, 4); Обратите внимание, что другие строки могут быть смещены соответственно. |
См. также endMoveRows().
[protected] void QAbstractItemModel::beginRemoveColumns(const QModelIndex &parent, int first, int last)
Начинает операцию удаления столбцов.
При переопределении removeColumns() в подклассе, необходимо вызвать эту функцию перед удалением данных из базового хранилища данных модели.
Индекс parent соответствует родителю, из которого удаляются новые столбцы; first и last — номера столбцов первого и последнего столбцов, которые нужно удалить.
| Укажите номера первого и последнего столбцов для диапазона столбцов, которые вы хотите удалить из элемента в модели. Например, как показано на диаграмме, мы удаляем три столбца со столбца 4 по столбец 6, поэтому first равно 4, а last равно 6: beginRemoveColumns(parent, 4, 6); |
Примечание: Эта функция генерирует сигнал columnsAboutToBeRemoved(), который подключенные представления (или прокси) должны обрабатывать до удаления данных. В противном случае представления могут оказаться в недействительном состоянии.
См. также endRemoveColumns().
[protected] void QAbstractItemModel::beginRemoveRows(const QModelIndex &parent, int first, int last)
Начинает операцию удаления строк.
При переопределении removeRows() в подклассе, необходимо вызвать эту функцию перед удалением данных из базового хранилища данных модели.
Индекс parent соответствует родителю, из которого удаляются новые строки; first и last — номера строк, которые нужно удалить.
| Укажите номера первой и последней строк для диапазона строк, которые вы хотите удалить из элемента в модели. Например, как показано на диаграмме, мы удаляем две строки со строки 2 по строку 3, поэтому first равно 2, а last равно 3: beginRemoveRows(parent, 2, 3); |
Примечание: Эта функция генерирует сигнал rowsAboutToBeRemoved(), который подключенные представления (или прокси) должны обрабатывать до удаления данных. В противном случае представления могут оказаться в недействительном состоянии.
См. также endRemoveRows().
[protected] void QAbstractItemModel::beginResetModel()
Начинает операцию сброса модели.
Операция сброса сбрасывает модель до её текущего состояния во всех присоединенных представлениях.
Примечание: Любые представления, прикрепленные к этой модели, также будут сброшены.
Когда модель сбрасывается, это означает, что любые предыдущие данные, полученные из модели, теперь недействительны и должны быть запрошены снова. Это также означает, что текущий элемент и любые выбранные элементы станут недействительными.
Когда модель радикально изменяет свои данные, иногда проще просто вызвать эту функцию, а не генерировать dataChanged() для информирования других компонентов о том, что изменился базовый источник данных или его структура.
Необходимо вызвать эту функцию перед сбросом любых внутренних структур данных в вашей модели или модели-прокси.
Эта функция генерирует сигнал modelAboutToBeReset().
См. также modelAboutToBeReset(), modelReset(), и endResetModel().
[virtual] QModelIndex QAbstractItemModel::buddy(const QModelIndex &index) const
Возвращает индекс модели для элемента-компаньона элемента, представленного index. Когда пользователь хочет изменить элемент, представление вызовет эту функцию, чтобы проверить, следует ли вместо этого редактировать другой элемент в модели. Затем представление создаст делегат, используя индекс модели, возвращаемый элементом-компаньоном.
Реализация этой функции по умолчанию имеет каждый элемент в качестве своего собственного компаньона.
[virtual] bool QAbstractItemModel::canDropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) const
Возвращает true если модель может принять перенос data. Эта реализация по умолчанию проверяет только, есть ли у data хотя бы один формат в списке mimeTypes() и является ли action одним из supportedDropActions() модели.
Переопределите эту функцию в своей пользовательской модели, если вы хотите проверить, можно ли переместить data в row, column, parent с action. Если вам не нужна эта проверка, переопределять эту функцию не обязательно.
См. также dropMimeData() и Using drag and drop with item views.
[virtual invokable] bool QAbstractItemModel::canFetchMore(const QModelIndex &parent) const
Возвращает true если для parent доступны дополнительные данные; в противном случае возвращает false.
Реализация по умолчанию всегда возвращает false.
Если canFetchMore() возвращает true, следует вызвать функцию fetchMore(). Таково поведение QAbstractItemView, например.
Примечание: Эту функцию можно вызывать через систему метаобъектов и из QML. См. Q_INVOKABLE.
См. также fetchMore().
[protected] void QAbstractItemModel::changePersistentIndex(const QModelIndex &from, const QModelIndex &to)
Изменяет QPersistentModelIndex, равный заданному индексу модели from, на заданный индекс модели to.
Если не найден ни один постоянный индекс модели, равный заданному индексу модели from, ничего не изменяется.
См. также persistentIndexList() и changePersistentIndexList().
[protected] void QAbstractItemModel::changePersistentIndexList(const QModelIndexList &from, const QModelIndexList &to)
Изменяет {QPersistentModelIndex}ы, равные индексам в заданном списке индексов модели from, на заданный список индексов модели to.
Если не найдены постоянные индексы модели, равные индексам в заданном списке индексов модели from, ничего не изменяется.
См. также persistentIndexList() и changePersistentIndex().
[since 5.11] bool QAbstractItemModel::checkIndex(const QModelIndex &index, QAbstractItemModel::CheckIndexOptions options = CheckIndexOption::NoOption) const
Эта функция проверяет, является ли index допустимым индексом модели для этой модели. Допустимый индекс модели — это либо недействительный индекс модели, либо действительный индекс модели, для которого выполняются все следующие условия:
- модель индекса равна
this; - строка индекса больше или равна нулю;
- строка индекса меньше количества строк для родительского элемента индекса;
- столбец индекса больше или равен нулю;
- столбец индекса меньше количества столбцов для родительского элемента индекса.
Аргумент options может изменить некоторые из этих проверок. Если options содержит IndexIsValid, то index должен быть действительным индексом; это полезно при переопределении таких функций, как data() или setData(), которые ожидают действительные индексы.
Если options содержит DoNotUseParent, то проверки, которые вызывают parent(), пропускаются; это позволяет вызывать эту функцию из переопределения parent() (в противном случае это приведет к бесконечной рекурсии и сбою).
Если options не содержит DoNotUseParent, и содержит ParentIsInvalid, то выполняется дополнительная проверка: проверяется, что родительский индекс не является действительным. Это полезно при реализации плоских моделей, таких как списки или таблицы, где ни у одного индекса модели не должно быть действительного родительского индекса.
Эта функция возвращает true, если все проверки выполнены успешно, и false в противном случае. Это позволяет использовать функцию в Q_ASSERT и аналогичных механизмах отладки. Если какая-либо проверка завершилась неудачей, предупреждающее сообщение будет выведено в категории логирования qt.core.qabstractitemmodel.checkindex, содержащее некоторую информацию, которая может быть полезна для отладки сбоя.
Примечание: Эта функция является вспомогательным инструментом отладки для реализации собственных моделей элементов. При разработке сложных моделей, а также при создании сложных иерархий моделей (например, с использованием моделей-прокси), полезно вызывать эту функцию для обнаружения ошибок, связанных с недопустимыми индексами модели (как определено выше), случайно переданными в некоторый API QAbstractItemModel.
Предупреждение: Обратите внимание, что передача недопустимых индексов в модели элементов является неопределенным поведением, поэтому приложения должны воздерживаться от этого и не полагаться на какую-либо «защитную» программируемую модель обработки недопустимых индексов.
Эта функция была добавлена в Qt 5.11.
См. также QModelIndex.
[virtual, since 6.0] bool QAbstractItemModel::clearItemData(const QModelIndex &index)
Удаляет данные, хранящиеся во всех ролях для заданного index. Возвращает true в случае успеха; в противном случае возвращает false. Сигнал dataChanged() должен быть испущен, если данные были успешно удалены. Базовая реализация класса возвращает false
Эта функция была добавлена в Qt 6.0.
См. также data(), itemData(), setData(), и setItemData().
[pure virtual invokable] int QAbstractItemModel::columnCount(const QModelIndex &parent = QModelIndex()) const
Возвращает количество столбцов для дочерних элементов данного parent.
В большинстве подклассов количество столбцов не зависит от parent.
Например:
int DomModel::columnCount(const QModelIndex &parent) const
{
Q_UNUSED(parent);
return 3;
} Примечание: При реализации модели на основе таблицы columnCount() должен возвращать 0, когда родительский элемент является допустимым.
Примечание: Эта функция может быть вызвана через систему метаобъектов и из QML. См. Q_INVOKABLE.
См. также rowCount().
[protected] QModelIndex QAbstractItemModel::createIndex(int row, int column, const void *ptr = nullptr) const
Создает индекс модели для заданных row и column с внутренним указателем ptr.
При использовании QSortFilterProxyModel, его индексы имеют свой собственный внутренний указатель. Не рекомендуется обращаться к этому внутреннему указателю за пределами модели. Вместо этого используйте функцию data().
Эта функция предоставляет согласованный интерфейс, который подклассы модели должны использовать для создания индексов модели.
[protected] QModelIndex QAbstractItemModel::createIndex(int row, int column, quintptr id) const
Создает индекс модели для заданных row и column с внутренним идентификатором id.
Эта функция предоставляет согласованный интерфейс, который подклассы модели должны использовать для создания индексов модели.
См. также QModelIndex::internalId().
[pure virtual invokable] QVariant QAbstractItemModel::data(const QModelIndex &index, int role = Qt::DisplayRole) const
Возвращает данные, хранящиеся под заданной role для элемента, на который ссылается index.
Примечание: Если у вас нет значения для возврата, верните недопустимый QVariant вместо возврата 0.
Примечание: Эта функция может быть вызвана через систему метаобъектов и из QML. См. Q_INVOKABLE.
См. также Qt::ItemDataRole, setData(), и headerData().
[virtual] bool QAbstractItemModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent)
Обрабатывает data, предоставленные операцией перетаскивания, которая завершилась с заданным action.
Возвращает true если данные и действие были обработаны моделью; в противном случае возвращает false.
Заданные row, column и parent указывают на местоположение элемента в модели, где операция завершилась. Модель отвечает за выполнение действия в правильном месте.
Например, действие перетаскивания на элемент в QTreeView может привести к тому, что новые элементы будут вставлены либо как дочерние элементы элемента, указанного row, column и parent, либо как сопоставления элемента.
Когда row и column равны -1, это означает, что перетаскиваемые данные следует рассматривать как перетаскиваемые непосредственно на parent. Обычно это будет означать добавление данных в качестве дочерних элементов parent. Если row и column больше или равны нулю, это означает, что перетаскивание произошло непосредственно перед указанным row и column в указанном parent.
Член mimeTypes() вызывается для получения списка допустимых типов MIME. Эта реализация по умолчанию предполагает реализацию по умолчанию mimeTypes(), которая возвращает один тип MIME по умолчанию. Если вы переопределяете mimeTypes() в своей пользовательской модели для возврата нескольких типов MIME, вы должны переопределить эту функцию, чтобы использовать их.
См. также supportedDropActions(), canDropMimeData(), и Использование перетаскивания с представлениями элементов.
[protected] void QAbstractItemModel::endInsertColumns()
Завершает операцию вставки столбца.
При переопределении insertColumns() в подклассе вы должны вызвать эту функцию после вставки данных в базовое хранилище данных модели.
См. также beginInsertColumns().
[protected] void QAbstractItemModel::endInsertRows()
Завершает операцию вставки строки.
При переопределении insertRows() в подклассе вы должны вызвать эту функцию после вставки данных в базовое хранилище данных модели.
См. также beginInsertRows().
[protected] void QAbstractItemModel::endMoveColumns()
Завершает операцию перемещения столбца.
При реализации подкласса вы должны вызвать эту функцию после перемещения данных в базовом хранилище данных модели.
См. также beginMoveColumns().
[protected] void QAbstractItemModel::endMoveRows()
Завершает операцию перемещения строки.
При реализации подкласса вы должны вызвать эту функцию после перемещения данных в базовом хранилище данных модели.
См. также beginMoveRows().
[protected] void QAbstractItemModel::endRemoveColumns()
Завершает операцию удаления столбца.
При переопределении removeColumns() в подклассе вы должны вызвать эту функцию после удаления данных из базового хранилища данных модели.
См. также beginRemoveColumns().
[protected] void QAbstractItemModel::endRemoveRows()
Завершает операцию удаления строки.
При переопределении removeRows() в подклассе вы должны вызвать эту функцию после удаления данных из базового хранилища данных модели.
См. также beginRemoveRows().
[protected] void QAbstractItemModel::endResetModel()
Завершает операцию сброса модели.
Вы должны вызвать эту функцию после сброса любой внутренней структуры данных в вашей модели или модели-прокси.
Эта функция испускает сигнал modelReset().
См. также beginResetModel().
[virtual invokable] void QAbstractItemModel::fetchMore(const QModelIndex &parent)
Извлекает любые доступные данные для элементов с родителем, указанным индексом parent.
Переопределите это, если вы заполняете свою модель поэтапно.
Реализация по умолчанию ничего не делает.
Примечание: Эта функция может быть вызвана через систему метаобъектов и из QML. См. Q_INVOKABLE.
См. также canFetchMore().
[virtual invokable] Qt::ItemFlags QAbstractItemModel::flags(const QModelIndex &index) const
Возвращает флаги элемента для заданного index.
Реализация базового класса возвращает сочетание флагов, которые включают элемент (ItemIsEnabled) и позволяют его выбрать (ItemIsSelectable).
Примечание: Эта функция может быть вызвана через систему метаобъектов и из QML. См. Q_INVOKABLE.
См. также Qt::ItemFlags.
[virtual invokable] bool QAbstractItemModel::hasChildren(const QModelIndex &parent = QModelIndex()) const
Возвращает true если parent имеет дочерние элементы; в противном случае возвращает false.
Используйте rowCount() для родительского элемента, чтобы узнать количество дочерних элементов.
Обратите внимание, что поведение не определено, если этот метод сообщает, что для определенного индекса hasChildren, если для того же индекса установлен флаг Qt::ItemNeverHasChildren.
Примечание: Эту функцию можно вызывать через систему метаобъектов и из QML. См. Q_INVOKABLE.
[invokable] bool QAbstractItemModel::hasIndex(int row, int column, const QModelIndex &parent = QModelIndex()) const
Возвращает true если модель возвращает допустимый QModelIndex для row и column с parent, в противном случае возвращает false.
Примечание: Эту функцию можно вызывать через систему метаобъектов и из QML. См. Q_INVOKABLE.
[virtual invokable] QVariant QAbstractItemModel::headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const
Возвращает данные для заданной role и section в заголовке с указанной orientation.
Для горизонтальных заголовков номер раздела соответствует номеру столбца. Аналогично, для вертикальных заголовков номер раздела соответствует номеру строки.
Примечание: Эту функцию можно вызывать через систему метаобъектов и из QML. См. Q_INVOKABLE.
См. также Qt::ItemDataRole, setHeaderData(), и QHeaderView.
[pure virtual invokable] QModelIndex QAbstractItemModel::index(int row, int column, const QModelIndex &parent = QModelIndex()) const
Возвращает индекс элемента в модели, заданный указанными индексами row, column и parent.
При переопределении этой функции в подклассе вызовите createIndex() для генерации индексов модели, которые другие компоненты могут использовать для ссылки на элементы в вашей модели.
Примечание: Эту функцию можно вызывать через систему метаобъектов и из QML. См. Q_INVOKABLE.
См. также createIndex().
bool QAbstractItemModel::insertColumn(int column, const QModelIndex &parent = QModelIndex())
Вставляет один столбец перед заданным column в дочерних элементах указанного parent.
Возвращает true если столбец вставлен; в противном случае возвращает false.
См. также insertColumns(), insertRow(), и removeColumn().
[virtual] bool QAbstractItemModel::insertColumns(int column, int count, const QModelIndex &parent = QModelIndex())
В моделях, которые это поддерживают, вставляет count новых столбцов в модель перед заданным column. Элементы в каждом новом столбце будут дочерними элементами элемента, представленного индексом модели parent.
Если column равен 0, столбцы добавляются в начало любых существующих столбцов.
Если column равен columnCount(), столбцы добавляются в конец любых существующих столбцов.
Если у parent нет дочерних элементов, вставляется одна строка с count столбцами.
Возвращает true если столбцы были успешно вставлены; в противном случае возвращает false.
Базовая реализация класса ничего не делает и возвращает false.
Если вы реализуете свою собственную модель, вы можете переопределить эту функцию, если хотите поддерживать вставки. В качестве альтернативы вы можете предоставить свой собственный API для изменения данных.
См. также insertRows(), removeColumns(), beginInsertColumns(), и endInsertColumns().
bool QAbstractItemModel::insertRow(int row, const QModelIndex &parent = QModelIndex())
Вставляет одну строку перед заданной row в дочерних элементах указанного parent.
Примечание: Эта функция вызывает виртуальный метод insertRows.
Возвращает true если строка вставлена; в противном случае возвращает false.
См. также insertRows(), insertColumn(), и removeRow().
[virtual] bool QAbstractItemModel::insertRows(int row, int count, const QModelIndex &parent = QModelIndex())
Примечание: Базовая реализация этой функции ничего не делает и возвращает false.
В моделях, которые это поддерживают, вставляет count строк в модель перед заданной row. Элементы в новой строке будут дочерними элементами элемента, представленного индексом модели parent.
Если row равен 0, строки добавляются в начало любых существующих строк в родительском элементе.
Если row равен rowCount(), строки добавляются в конец любых существующих строк в родительском элементе.
Если у parent нет дочерних элементов, вставляется один столбец с count строками.
Возвращает true если строки были успешно вставлены; в противном случае возвращает false.
Если вы реализуете свою собственную модель, вы можете переопределить эту функцию, если хотите поддерживать вставки. В качестве альтернативы вы можете предоставить свой собственный API для изменения данных. В любом случае, вам нужно будет вызвать beginInsertRows() и endInsertRows() для уведомления других компонентов об изменении модели.
См. также insertColumns(), removeRows(), beginInsertRows(), и endInsertRows().
[virtual] QMap<int, QVariant> QAbstractItemModel::itemData(const QModelIndex &index) const
Возвращает карту со значениями для всех предопределенных ролей в модели для элемента с заданным index.
Переопределите эту функцию, если вы хотите расширить поведение этой функции по умолчанию, включив в карту пользовательские роли.
См. также setItemData(), Qt::ItemDataRole, и data().
[virtual invokable] QModelIndexList QAbstractItemModel::match(const QModelIndex &start, int role, const QVariant &value, int hits = 1, Qt::MatchFlags flags = Qt::MatchFlags(Qt::MatchStartsWith|Qt::MatchWrap)) const
Возвращает список индексов для элементов в столбце индекса start, где данные, хранящиеся под заданной role, соответствуют указанному value. Способ выполнения поиска определяется заданными flags. Возвращаемый список может быть пустым. Обратите внимание также, что порядок результатов в списке может не соответствовать порядку в модели, если, например, используется прокси-модель. На порядок результатов полагаться нельзя.
Поиск начинается с индекса start и продолжается до тех пор, пока количество совпадающих элементов данных не станет равно hits, поиск не достигнет последней строки или поиск не достигнет start снова — в зависимости от того, указан ли MatchWrap в flags. Если вы хотите найти все совпадающие элементы, используйте hits = -1.
По умолчанию эта функция выполняет циклическое, строковое сравнение всех элементов, ища элементы, которые начинаются с поискового термина, указанного в value.
Примечание: Реализация этой функции по умолчанию выполняет поиск только в столбцах. Переопределите эту функцию, чтобы включить другое поведение поиска.
Примечание: Эту функцию можно вызывать через систему метаобъектов и из QML. См. Q_INVOKABLE.
[virtual] QMimeData *QAbstractItemModel::mimeData(const QModelIndexList &indexes) const
Возвращает объект, содержащий сериализованные элементы данных, соответствующие указанному списку indexes. Формат, используемый для описания закодированных данных, получается из функции mimeTypes(). Эта реализация по умолчанию использует тип MIME по умолчанию, возвращаемый реализацией mimeTypes() по умолчанию. Если вы переопределяете mimeTypes() в своей пользовательской модели, чтобы возвращать больше типов MIME, переопределите эту функцию, чтобы использовать их.
Если список indexes пуст или нет поддерживаемых типов MIME, возвращается nullptr вместо сериализованного пустого списка.
См. также mimeTypes() и dropMimeData().
[virtual] QStringList QAbstractItemModel::mimeTypes() const
Возвращает список разрешенных типов MIME. По умолчанию встроенные модели и представления используют внутренний тип MIME: application/x-qabstractitemmodeldatalist.
При реализации поддержки перетаскивания в пользовательской модели, если вы будете возвращать данные в форматах, отличных от внутреннего типа MIME по умолчанию, переопределите эту функцию, чтобы вернуть ваш список типов MIME.
Если вы переопределяете эту функцию в своей пользовательской модели, вы также должны переопределить функции-члены, которые её вызывают: mimeData() и dropMimeData().
См. также mimeData() и dropMimeData().
bool QAbstractItemModel::moveColumn(const QModelIndex &sourceParent, int sourceColumn, const QModelIndex &destinationParent, int destinationChild)
В моделях, которые это поддерживают, перемещает sourceColumn из sourceParent в destinationChild под destinationParent.
Возвращает true если столбцы были успешно перемещены; в противном случае возвращает false.
См. также moveColumns() и moveRow().
[virtual] bool QAbstractItemModel::moveColumns(const QModelIndex &sourceParent, int sourceColumn, int count, const QModelIndex &destinationParent, int destinationChild)
В моделях, которые это поддерживают, перемещает count столбцов, начиная с заданного sourceColumn под родительским элементом sourceParent, в столбец destinationChild под родительским элементом destinationParent.
Возвращает true если столбцы были успешно перемещены; в противном случае возвращает false.
Базовая реализация класса ничего не делает и возвращает false.
Если вы реализуете свою собственную модель, вы можете переопределить эту функцию, если хотите поддерживать перемещение. В качестве альтернативы, вы можете предоставить свой собственный API для изменения данных.
См. также beginMoveColumns() и endMoveColumns().
bool QAbstractItemModel::moveRow(const QModelIndex &sourceParent, int sourceRow, const QModelIndex &destinationParent, int destinationChild)
В моделях, которые это поддерживают, перемещает sourceRow из sourceParent в destinationChild под destinationParent.
Возвращает true если строки были успешно перемещены; в противном случае возвращает false.
См. также moveRows() и moveColumn().
[virtual] bool QAbstractItemModel::moveRows(const QModelIndex &sourceParent, int sourceRow, int count, const QModelIndex &destinationParent, int destinationChild)
В моделях, которые это поддерживают, перемещает count строк, начиная с заданной sourceRow под родительским элементом sourceParent, в строку destinationChild под родительским элементом destinationParent.
Возвращает true если строки были успешно перемещены; в противном случае возвращает false.
Базовая реализация класса ничего не делает и возвращает false.
Если вы реализуете свою собственную модель, вы можете переопределить эту функцию, если хотите поддерживать перемещение. В качестве альтернативы, вы можете предоставить свой собственный API для изменения данных.
См. также beginMoveRows() и endMoveRows().
[virtual, since 6.0] void QAbstractItemModel::multiData(const QModelIndex &index, QModelRoleDataSpan roleDataSpan) const
Заполняет roleDataSpan запрошенными данными для данного index.
Реализация по умолчанию будет просто вызывать data() для каждой роли в диапазоне. Подкласс может переопределить эту функцию для более эффективной передачи данных представлениям:
void MyModel::multiData(const QModelIndex &index, QModelRoleDataSpan roleDataSpan) const
{
for (QModelRoleData &roleData : roleDataSpan) {
int role = roleData.role();
// ... obtain the data for index and role ...
roleData.setData(result);
}
} В приведенном выше фрагменте кода index одинаков для всего вызова. Это означает, что доступ к необходимым структурам данных для получения информации для index может быть выполнен только один раз (вынесение соответствующего кода из цикла).
Рекомендуется использовать QModelRoleData::setData() или аналогично QVariant::setValue(), а не создавать QVariant отдельно и использовать оператор простого присваивания; это связано с тем, что первое позволяет повторно использовать память, уже выделенную для объекта QVariant, хранящегося внутри QModelRoleData, в то время как последнее всегда выделяет новый вариант, а затем уничтожает старый.
Обратите внимание, что представления могут вызывать multiData() с диапазонами, которые использовались в предыдущих вызовах и, следовательно, могут уже содержать некоторые данные. Поэтому крайне важно, чтобы если модель не может вернуть данные для данной роли, то она должна очистить данные в соответствующем объекте QModelRoleData. Это можно сделать, вызвав QModelRoleData::clearData() или аналогично, установив QVariant с конструктором по умолчанию и так далее. Неудачное очищение данных приведет к тому, что представление будет считать, что «старые» данные предназначены для использования для соответствующей роли.
Наконец, чтобы избежать дублирования кода, подкласс может также решить переопределить data() с точки зрения multiData(), предоставив диапазон всего из одного элемента:
QVariant MyModel::data(const QModelIndex &index, int role) const
{
QModelRoleData roleData(role);
multiData(index, roleData);
return roleData.data();
} Примечание: Модели не могут изменять роли в диапазоне или переставлять элементы диапазона. Это приводит к неопределенному поведению.
Примечание: Недопустимо передавать неверный индекс модели в эту функцию.
Эта функция была добавлена в Qt 6.0.
См. также QModelRoleDataSpan и data().
[pure virtual invokable] QModelIndex QAbstractItemModel::parent(const QModelIndex &index) const
Возвращает родительский элемент элемента модели с заданным index. Если элемент не имеет родительского элемента, возвращается неверный QModelIndex.
Распространенное соглашение, используемое в моделях, которые предоставляют древовидные структуры данных, состоит в том, что только элементы в первом столбце имеют дочерние элементы. В этом случае при переопределении этой функции в подклассе столбец возвращаемого QModelIndex будет равен 0.
При переопределении этой функции в подклассе будьте осторожны, чтобы избежать вызова функций-членов QModelIndex, таких как QModelIndex::parent(), поскольку индексы, принадлежащие вашей модели, просто вызовут вашу реализацию, что приведет к бесконечной рекурсии.
Примечание: Эта функция может вызываться через систему мета-объектов и из QML. См. Q_INVOKABLE.
См. также createIndex().
[protected] QModelIndexList QAbstractItemModel::persistentIndexList() const
Возвращает список индексов, хранящихся как постоянные индексы в модели.
bool QAbstractItemModel::removeColumn(int column, const QModelIndex &parent = QModelIndex())
Удаляет заданный column из дочерних элементов указанного parent.
Возвращает true если столбец удален; в противном случае возвращает false.
См. также removeColumns(), removeRow() и insertColumn().
[virtual] bool QAbstractItemModel::removeColumns(int column, int count, const QModelIndex &parent = QModelIndex())
В моделях, которые это поддерживают, удаляет count столбцов, начиная с заданного column под родительским элементом parent, из модели.
Возвращает true если столбцы были успешно удалены; в противном случае возвращает false.
Базовая реализация класса ничего не делает и возвращает false.
Если вы реализуете свою собственную модель, вы можете переопределить эту функцию, если хотите поддерживать удаление. В качестве альтернативы, вы можете предоставить свой собственный API для изменения данных.
См. также removeColumn(), removeRows(), insertColumns(), beginRemoveColumns() и endRemoveColumns().
bool QAbstractItemModel::removeRow(int row, const QModelIndex &parent = QModelIndex())
Удаляет заданную row из дочерних элементов указанного parent.
Возвращает true если строка удалена; в противном случае возвращает false.
Это вспомогательная функция, которая вызывает removeRows(). Реализация QAbstractItemModel функции removeRows() ничего не делает.
См. также removeRows(), removeColumn(), и insertRow().
[virtual] bool QAbstractItemModel::removeRows(int row, int count, const QModelIndex &parent = QModelIndex())
В моделях, которые это поддерживают, удаляет count строк, начиная со строки row под родительским элементом parent из модели.
Возвращает true если строки были успешно удалены; в противном случае возвращает false.
Базовая реализация класса ничего не делает и возвращает false.
Если вы реализуете свою собственную модель, вы можете переопределить эту функцию, если хотите поддерживать удаление. В качестве альтернативы вы можете предоставить свой собственный API для изменения данных.
См. также removeRow(), removeColumns(), insertColumns(), beginRemoveRows(), и endRemoveRows().
[virtual] QHash<int, QByteArray> QAbstractItemModel::roleNames() const
Возвращает имена ролей модели.
Имена ролей по умолчанию, установленные Qt:
| Роль Qt | Имя роли QML |
|---|---|
| Qt::DisplayRole | display |
| Qt::DecorationRole | decoration |
| Qt::EditRole | edit |
| Qt::ToolTipRole | toolTip |
| Qt::StatusTipRole | statusTip |
| Qt::WhatsThisRole | whatsThis |
[pure virtual invokable] int QAbstractItemModel::rowCount(const QModelIndex &parent = QModelIndex()) const
Возвращает количество строк под заданным parent. Когда родительский элемент является допустимым, это означает, что rowCount возвращает количество дочерних элементов родителя.
Примечание: При реализации модели на основе таблицы rowCount() должен возвращать 0, когда родительский элемент является допустимым.
Примечание: Эта функция может быть вызвана через систему мета-объектов и из QML. См. Q_INVOKABLE.
См. также columnCount().
[virtual invokable] bool QAbstractItemModel::setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole)
Устанавливает данные role для элемента по index в value.
Возвращает true в случае успеха; в противном случае возвращает false.
Сигнал dataChanged() должен быть отправлен, если данные были успешно установлены.
Базовая реализация класса возвращает false. Эта функция и data() должны быть переопределены для редактируемых моделей.
Примечание: Эта функция может быть вызвана через систему мета-объектов и из QML. См. Q_INVOKABLE.
См. также Qt::ItemDataRole, data(), и itemData().
[virtual] bool QAbstractItemModel::setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role = Qt::EditRole)
Устанавливает данные для заданной role и section в заголовке с указанной orientation в предоставленное value.
Возвращает true если данные заголовка были обновлены; в противном случае возвращает false.
При переопределении этой функции сигнал headerDataChanged() должен быть отправлен явно.
См. также Qt::ItemDataRole и headerData().
[virtual] bool QAbstractItemModel::setItemData(const QModelIndex &index, const QMap<int, QVariant> &roles)
Устанавливает данные роли для элемента по index в соответствующее значение в roles для каждой Qt::ItemDataRole.
Возвращает true в случае успеха; в противном случае возвращает false.
Роли, которых нет в roles, не будут изменены.
См. также setData(), data(), и itemData().
[virtual invokable] QModelIndex QAbstractItemModel::sibling(int row, int column, const QModelIndex &index) const
Возвращает соседний элемент в строке row и столбце column для элемента по index или недопустимый QModelIndex, если в этом месте нет соседнего элемента.
sibling() — это всего лишь вспомогательная функция, которая находит родительский элемент и использует его для получения индекса дочернего элемента в указанной строке row и столбце column.
Этот метод может быть необязательно переопределен для оптимизации, специфичной для реализации.
Примечание: Эта функция может быть вызвана через систему мета-объектов и из QML. См. Q_INVOKABLE.
См. также index(), QModelIndex::row(), и QModelIndex::column().
[virtual] void QAbstractItemModel::sort(int column, Qt::SortOrder order = Qt::AscendingOrder)
Сортирует модель по column в заданном order.
Базовая реализация класса ничего не делает.
[virtual] QSize QAbstractItemModel::span(const QModelIndex &index) const
Возвращает диапазон строк и столбцов элемента, представленного index.
Примечание: В настоящее время span не используется.
[virtual] Qt::DropActions QAbstractItemModel::supportedDragActions() const
Возвращает действия, поддерживаемые данными в этой модели.
Реализация по умолчанию возвращает supportedDropActions(). Переопределите эту функцию, если вы хотите поддерживать дополнительные действия.
supportedDragActions() используется QAbstractItemView::startDrag() в качестве значений по умолчанию при перетаскивании.
См. также Qt::DropActions и Using drag and drop with item views.
[virtual] Qt::DropActions QAbstractItemModel::supportedDropActions() const
Возвращает действия перетаскивания, поддерживаемые этой моделью.
Реализация по умолчанию возвращает Qt::CopyAction. Переопределите эту функцию, если вы хотите поддерживать дополнительные действия. Вы также должны переопределить функцию dropMimeData() для обработки дополнительных операций.
См. также dropMimeData(), Qt::DropActions, и Using drag and drop with item views.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.2/qabstractitemmodel.html