Я подкласс QAbstractTableModel, и я создал сигнал, который должен испускаться, когда QModelIndex
данные конкретного столбца изменены.
в void data(const QModelIndex &index, int role) const
Я написал что-то вроде этого:
Variant DerivedClass::data(const QModelIndex &index, int role) const
{
if (role == Qt::DisplayRole)
{
switch (index.column())
{
// ....
case NAME_COLUMN_INDEX :
{
return updateName(index);
} break;
}
}
return QVariant();
}
а это updateName
QString DerivedClass::updateName(const QModelIndex &xIndex) const
{
QString xName;
if (false == xIndex.data().isNull() && true == xIndex.data().isValid())
{
xName = m_xDataVector.at(xIndex.row()).getName();
if (xName != xIndex.data().toString())
{
emit nameChanged(m_xCellName, xName); // m_xCellName is specified otherwise
}
}
return xName;
}
В этом случае, когда я создаю виджет, который использует эту модель, у меня есть исключение памяти в этой строке:
if (false == xIndex.data().isNull() && true == xIndex.data().isValid())
Если я изменю свой метод, удалив ссылку на данные, подобные этой:
QString DerivedClass::updateName(const QModelIndex &xIndex) const
{
QString xName;
xName = m_xDataVector.at(xIndex.row()).getName();
return xName;
}
У меня правильно обновлены данные в моей таблице, но при смене имени сигнал не подается.
Как я могу правильно проверить данные, которые я должен обновить, чтобы уведомить их об изменении?
РЕДАКТИРОВАТЬ:
Из моего стека вызовов я заметил, что сбой происходит из-за рекурсивных вызовов. в DerivedClass::data()
Я звоню DerivedClass::updateName()
и в этом xIndex.data()
, xIndex — это мой экземпляр, так что у меня есть рекурсия с бесконечной глубиной.
Я обнаружил проблему, но не могу найти способ извлечь данные в указанной строке и столбце, чтобы выполнить свою проверку.
Задача ещё не решена.