QAbstractItemModel + ModelTest::rowsInserted断言问题

QAbstractItemModel + ModelTest::rowsInserted ASSERTion problem

本文关键字:断言 问题 rowsInserted QAbstractItemModel ModelTest      更新时间:2023-10-16

我正试图用ModelTest调试我的模型(QAbstractItemModel)。我不能理解一个断言。

ModelTest中有两个槽,用来截取我的模型产生的信号。

  1. ModelTest: rowsAboutToBeInserted
  2. ModelTest: rowsInserted

槽/函数1看起来像这样

void ModelTest::rowsAboutToBeInserted ( const QModelIndex &parent, int start, int end )
{
    Changing c;
    // ...
    c.last = model->data ( model->index ( start - 1, 0, parent ) );
    c.next = model->data ( model->index ( start, 0, parent ) );
    insert.push ( c );
}

槽2看起来像这样

void ModelTest::rowsInserted ( const QModelIndex & parent, int start, int end )
{
    Changing c = insert.pop();
    // other asserts ...
    (*) Q_ASSERT ( c.next == model->data ( model->index ( end + 1, 0, c.parent ) ) );
}

我不明白最后一个断言(*)。假设在我的应用中,我添加了1行。这一行是存储在我的模型中的唯一一行。因此行号为0。

在我的模型中,在添加行之前,我调用
beginInsertRows(parentIndex, 0, 0);

那么为什么modeltest需要

model->data (model->index (start, 0, parent))

等于

model->data (model->index (end + 1,0, c.parent))

我在这里错过了什么?请帮忙:)

这个断言背后的思想是检查添加的行之后的第一行是否被正确移动。如果插入的行之后还有一些行,则比较它们的数据。如果没有,你的模型应该在

c.next = model->data ( model->index ( start, 0, parent ) );

Q_ASSERT ( c.next == model->data ( model->index ( end + 1, 0, c.parent ) ) );

应该返回无效的(空)QVariant。如果两者都返回空QVariant(就像它们应该的那样),则断言成功,从而提供某种程度的错误检查,即使在当前插入之后没有行。