0

我对 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 是我的实例本身,所以我有一个无限深的递归。

我找到了问题,但我找不到在指定行和列检索数据以执行检查的方法。

4

0 回答 0