Я создал QAbstractListModel, модельные индексы которого содержат указатель, который мне абсолютно необходим для обработки данных.
Если вы начнете с неправильных требований, вы получите неправильные решения:)
Модель
A list достаточно проста, так что вам не нужно больше, чем QModelIndex
s row()
, чтобы однозначно определить данные для адресов индекса.
Итак, учитывая QModelIndex
mi
, когда вы раньше делали
PointItem * item = static_cast<PointItem*>(mi.internalPointer());
вы можете вместо этого сделать
PointItem * item = plm->pointItemFromIndex(mi);
, где plm
- ваш PointListModel
. Если у вас нет указателя на него, когда вам нужен доступ к PointItem
, вы можете восстановить его следующим образом:
PointItemModel * plm = qobject_cast<PointItemModel*>(mi.model());
// check for !plm here (!mi.isValid() || qobject_cast fails)
В свою очередь, PointListMode::pointItemFromIndex()
будет выполнять фактическую работу:
PointItem * PointListMode::pointItemFromindex(const QModelIndex &mi) const {
return mi.isValid() ? m_points[mi.row()] : 0 ;
}
Это наиболее важная вещь для понимания при работе с QAbstractListModel
в Qt: мысленно замените QModelIndex
на int row
, игнорируйте все остальное (недопустимый QModelIndex
имеет row() == -1
).
То же самое для QAbstractTableModel
: мысленно уменьшите QModelIndex
до int row, int column
. Забудь обо всем остальном.
Единственный раз, когда вам нужен полный QModelIndex
(включая internalPointer()
или internalId()
, это когда вы реализуете модель дерева (QAbstractItemModel
).