我已经将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;
}
我在表格中正确更新了数据,但在名称更改时不会发出信号。
如何正确检查必须更新的数据,以便在更改时通知?
编辑:
从我的callstack中我注意到崩溃是由于递归调用造成的。在DerivedClass::data()
中,我致电DerivedClass::updateName()
,并在此xIndex.data()
。 xIndex是我的实例本身,所以我有一个无限深的递归。
我发现了问题,但我无法找到在指定行和列检索数据的方法来执行检查。