我对 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 是我的实例本身,所以我有一个无限深的递归。
我找到了问题,但我找不到在指定行和列检索数据以执行检查的方法。