Думаю все таки вам стоит почитать соответствующий раздел ассистента. Ф-ция index в модели используеться именно для формирования индекса модели. Третим параметром туда передаеться индекс парента, вы же используете его для доступа к даным в хеше, интерпритируя его как текущий индекс. Это не есть правельно!!!. Предлагаю следующее:
1) Изменить форму хранения CTableItem. Так чтоб доступ не зависел от QModelIndex. Скажем пускай будет так
typedef QPair<int, int> TableIndex;
QHash<TableIndex, CTableItem*> m_hash;
здесь еще надо реализовать ф-цию qHash() (см. Assistant). Вторым параметром предпочтительней использовать указатель. Тот вариант который был у вас не коректен. Если вы еще раз посмотрите на код в ф-ции index то увидете что там вы возвращаете адрес локального объекта. Это не позволительно, т.к. при фыходе из этой ф-ции локальный объект разрушаеться и у вас остаеться указатель на "муссор". Из-за этого могут быть проблемы хуже чем с нудевым указателем
2) Ф-ция data приймет такой вид:
QVariant CDragDropModel::data(const QModelIndex &index, int nRole) const
{
if(index.isValid())
{
if ( nRole == Qt::DisplayRole || nRole == Qt::EditRole ) // вобще EditRole на сколько я знаю используеться для установки данных
{
if ( CTableItem * item = static_cast<CTableItem *>(index.internalPointer()) ) // коректный индекс уже содержит указатель на нужные нам данные
{
return item->itemCaption;
}
}
}
return QVariant();
}
3) ф-ция index будет выглядеть так:
QModelIndex CDragDropModel::index(int row, int column, const QModelIndex &parent) const
{
if(!hasIndex(row, column, parent))
return QModelIndex();
TableIndex index = qMakePair( row, column );
CTableItem * item = m_hash[index];
return createIndex(row, column, item); // вот теперь ф-ция internalPointer() будет возвращать указатель на нужные нам данные
}
4) ф-ция setData может быть такой
bool CDragDropModel::setData(QModelIndex &index, const CTableItem& value, int nRole) {
if(index.isValid() && nRole == Qt::EditRole)// установка происходит по EditRole!!! у вас было DisplayRole
{
if ( CTableItem * item = static_cast<CTableItem *>(index.internalPointer()) ) // коректный индекс уже содержит указатель на нужные нам данные
{
item->itemCaption = value;
emit dataChanged(index, index);
return true;
}
}
return false;
}
5) Понятия не имею расширяеться у вас таблица или остаеться статичной взависемости от этого вам уже самому решать как формировать ваш хеш данных.